我在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)
怎么可能? 谢谢!
答案 0 :(得分:0)
我最终用调试器对此进行了深入研究,突然间,不对称性也消失了,item.cart.items.all()
并没有真正反映数据库的状态。
似乎在相关管理器中有某种缓存或刷新逻辑正在妨碍我,但我仍然不明白。
我最终对CartItem模型进行了重新调用,而没有经过相关的经理,一切都很好。
CartItem.objects.filter(cart=self).all()
代替上面的
self.items.all()