Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模型方法在第一次调用后停止正常工作_Python_Django_Django Models_Model - Fatal编程技术网

Python 模型方法在第一次调用后停止正常工作

Python 模型方法在第一次调用后停止正常工作,python,django,django-models,model,Python,Django,Django Models,Model,我为零售商及其库存中的商品定义了两个模型。产品已在另一个应用程序中定义。我定义了两个模型方法来获取和添加库存项。以下是守则的相关部分: class Retailer(models.Model): name = models.CharField(max_length=100) @property def stock_items(self): return StockItem.objects.filter(retailer__id=F('id'))

我为零售商及其库存中的商品定义了两个模型。产品已在另一个应用程序中定义。我定义了两个模型方法来获取和添加库存项。以下是守则的相关部分:

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是16GB的iPhone,产品2是32GB的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.stock_items
[<StockItem: hh - Apple iPhone 4S 16GB>]
到目前为止还不错。现在,让我们再次尝试添加产品,看看它如何处理错误:

>>> 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 = 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.stock_items
[<StockItem: hh - Apple iPhone 4S 16GB>]
>>r.stock\u项目
[]
产品2怎么了?是否无法将其添加到数据库

[<StockItem: hh - Apple iPhone 4S 16GB>, <StockItem: hh - Apple iPhone 4S 32GB>, <StockItem: hh - Apple iPhone 4S 32GB>]
[,]
显然不是。它被添加到数据库中,但不知为什么我们的程序无法正确地检查它。调用r.stock\u items仅显示添加到stock的第一个产品。重新启动shell也不会改变这种情况,所以我想原因不可能是因为函数的求值时间


为什么会发生这种情况?我如何修复它?

尝试删除
@property
并将方法更改为:

def stock_items(self):
    return self.stockitem_set.all()

您的方法失败的原因是因为该表达式没有执行您认为它可以执行的操作。
F()
语法用于比较同一行中的值:因此表达式检查相关零售商ID是否与当前行的ID相同。碰巧第一个项目的ID为true,但任何后续项目的ID都不会为true,因为行ID随着新项目的增加而增加,但零售商ID保持不变。

请在保存前尝试第二次签入except函数。谢谢,只需将其更改为self.stockitem\u set.all()即可。但是为什么呢?如果您使用self.pk而不是F('id'),那么它也可以工作。但是实际上
stock\u items
必须是
StockItem
类方法,而不是
Retailer
类方法。我认为这样更好,因为现在view可以通过调用request.user.Retailer.stock\u items为当前用户检索库存(零售商与用户有一对一的关系。我的问题中没有包括类定义的这一部分)现在有意义了。谢谢。