【问题标题】:Create objects from one model based on new object in another model (Django)基于另一个模型中的新对象从一个模型创建对象(Django)
【发布时间】:2011-07-01 02:23:08
【问题描述】:

对 Django (1.2) 来说相当新,但只是测试一些东西。

我的头疼是想办法在创建 Product 对象时创建一系列 SKU 对象。

class Product(models.Model):
    name = models.CharField(max_length=255, unique=True)
    style = models.CharField(max_length=50)
    colors = models.ManyToManyField(Color)
    sizes = models.ManyToManyField(Size)

class SKU(models.Model):
    id = models.CharField(max_length=15, unique=True, primary_key=True)
    style = models.ForeignKey(Product)
    color = models.ForeignKey(Color)
    size = models.ForeignKey(Size)
    quantity = models.IntegerField(default=0)

我最初尝试在 Product.save 中处理这个问题,但可惜没有骰子。然后我尝试了这个信号设置:

# models.py
def create_skus(sender, instance, *args, **kwargs):
    if 'created' in kwargs:
        if kwargs['created']:
            for x in instance.colors.select_related():
                for y in instance.sizes.select_related():
                    sku = instance.style
                    sku += instance.x.shortcode
                    sku += instance.y.name
                    s = SKU(id=sku, style=instance, color=x, size=y)
                    s.save()

... # after the Product class
post_save.connect(create_skus, sender=Product)

我见过的一些例子要求发送者类保存方法有这样的东西:

def save(self):
    post_save.send(create_skus, self)

...这就是我所在的位置。此设置不会引发任何错误,但也不会创建上述 SKU。

如果我在任何这些信号方面都偏离了方向,任何指针都将不胜感激。或者如果有另一种技术来完成类似的壮举,那也很棒。

干杯!

【问题讨论】:

  • 你设置调试标记了吗?确保您的方法进入循环(请避免使用“x”和“y”,但使用“颜色”和“大小”)以了解此处发生的情况。实现信号的方式对我来说看起来不错。

标签: django django-models signals django-signals


【解决方案1】:
def create_skus(sender, instance, *args, **kwargs):
        if kwargs['created']:
            for color in instance.colors.select_related():
                for size in instance.sizes.select_related():
                    sku = u'%s%s%s' % (instance.style, color.shortcode, size.name) 
                    s = SKU(id=sku, style=instance, color=color, size=size)
                    s.save()

post_save.connect(create_skus, sender=Product)

这应该有效吗?如果没有,请尝试安装 Debug Toolbar 并检查 select_related() 是否返回了您期望的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多