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。
如果我对这些任何信号都不感兴趣,那么任何指针都会受到赞赏。或者,如果还有另一种技术可以完成类似的壮举,那也很棒。
干杯!
答案 0 :(得分:0)
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()是否返回您期望的结果。