我为零售商和库存中的商品定义了两种模型。产品在另一个应用程序中定义。我定义了两种模型方法来获取和添加库存项目。以下是代码的相关部分:
class Retailer(models.Model):
name = models.CharField(max_length=100)
@property
def stock_items(self):
return StockItem.objects.filter(retailer__id=F('id'))
def add_stock_item(self, product_id):
try:
print "Checking if it's already in stock"
self.stock_items.get(product__id=product_id)
print "It's already in stock"
except ObjectDoesNotExist:
try:
print "Adding item to stock"
product = Product.objects.get(pk=product_id)
StockItem.objects.create(retailer=self, product=product)
print "Added to stock"
except Product.DoesNotExist:
print "Such product doesn't exist"
def __unicode__(self):
return self.name
StockItem(models.Model):
retailer = models.ForeignKey(Retailer)
product = models.ForeignKey(Product)
def __unicode__(self):
return "%s - %s %s" % (self.retailer, self.product.brand, self.product)
当我想使用这些模型方法时,会发生一些奇怪的事情。添加第一项后,它们会停止正常工作(在这些示例中,产品1为16 GB iPhone,产品2为32 GB iPhone)。
首先让我们为我们的股票添加一些产品:
>>> r = Retailer.objects.get(pk=1)
>>> r.stock_items
[]
>>> r.add_stock_item(1)
Checking if it's already in stock
Adding item to stock
Added to stock
>>> r.add_stock_item(2)
Checking if it's already in stock
Adding item to stock
Added to stock
到目前为止一切顺利。现在让我们再次尝试添加产品,看看它是如何处理错误的:
>>> r.add_stock_item(1)
Checking if it's already in stock
It's already in stock
>>> r.add_stock_item(2)
Checking if it's already in stock
Adding item to stock
Added to stock
什么?为什么再次添加产品2。它应该显示类似于产品1的消息。让我们看看我们的股票:
>>> r.stock_items
[<StockItem: hh - Apple iPhone 4S 16GB>]
产品2发生了什么变化?是否无法将其添加到数据库?
[<StockItem: hh - Apple iPhone 4S 16GB>, <StockItem: hh - Apple iPhone 4S 32GB>, <StockItem: hh - Apple iPhone 4S 32GB>]
显然不是。它被添加到数据库中,但不知何故我们的程序无法正确检查它。只有通过调用r.stock_items才能显示添加到库存中的第一个产品。重新启动shell也不会改变这种情况,所以我想原因不是因为评估函数的时间。
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:1)
尝试删除@property
并将方法更改为:
def stock_items(self):
return self.stockitem_set.all()
答案 1 :(得分:1)
您的方法失败的原因是因为该表达式没有按照您的想法执行。 F()
语法用于比较同一行中的值 :因此该表达式检查相关零售商ID是否与当前行的ID相同。碰巧这对第一个项目来说是正确的,但对于任何后续项目都不会这样,因为行ID随新项目增加但零售商ID保持不变。