相关经理在一个方向上是空的,但在另一方向上不是空的

时间:2018-08-15 15:21:34

标签: python django python-3.x postgresql

我在Django模型上有一个方法,通过将self传递给get_or_create来创建一个新的相关实例:

def increment_or_create_item(self, product)
    item, created = Item.objects.get_or_create(cart=self, product=product)

在调用上述行后,没有立即在self.items.all()中显示的项目就足够了。 这有效:

assert self == item.cart # does not raise

但这引起了:

assert self.items.all() == item.cart.items.all() #does raise
assert self.items.count() == item.cart.items.count() #does raise

self.items.all()返回一个空的QuerySet,而item.cart.items.all()返回一个正确的已填充QuerySet。

我尝试致电self.refresh_from_db(),但没有成功。

模型真的很大,所以我不会在这里发布,但是我想重要的部分在这里:

class CartItem(Model):
    class Meta:
        unique_together = ['product', 'cart']

    num_units = models.PositiveIntegerField(default=1)

    product = models.ForeignKey(
        'boxes.Product',
        on_delete=models.CASCADE,
    )

    cart = models.ForeignKey(
        Cart,
        related_name='items',
        on_delete=models.CASCADE)

怎么可能? 谢谢!

1 个答案:

答案 0 :(得分:0)

我最终用调试器对此进行了深入研究,突然间,不对称性也消失了,item.cart.items.all()并没有真正反映数据库的状态。

似乎在相关管理器中有某种​​缓存或刷新逻辑正在妨碍我,但我仍然不明白。

我最终对CartItem模型进行了重新调用,而没有经过相关的经理,一切都很好。

CartItem.objects.filter(cart=self).all()

代替上面的

self.items.all()