Django get_or_create反向关系

时间:2016-09-08 17:37:03

标签: django django-models django-orm

我想使用get_or_create而不是这样做:

    cart = client.cart
    cartitems_cart = cart.__cartitem_set
    if not cartitems_cart.filter(item=stockitem).exists():
        cartitem = CartItem.objects.create(item=stockitem)
    else:
        cartitem = cartitems_cart.objects.get(item=stockitem)

有可能吗?

模型看起来像这样:

class CartItem(models.Model):
    item = models.ForeignKey(StockItem, blank=True)
    quantity = models.IntegerField(default=1, null=True)


class Cart(models.Model):
    items = models.ManyToManyField(CartItem, blank=True)

因此,我需要获取或创建与CartItem相关的Cart。我不确定如何编写该查询。

1 个答案:

答案 0 :(得分:2)

首先,您的设计存在缺陷。 M2M关系允许购物车商品不应该有多个购物车。您应该将一个FK字段添加到CartItem模型,而不是将M2M字段添加到购物车模型:

class Cart(models.Model):
    user = models.ForeignKey(User)

class CartItem(models.Model):
    item = models.ForeignKey(StockItem, blank=True)
    quantity = models.IntegerField(default=1, null=True)
    cart = models.ForeignKey(Cart, related_name="items")

所以你可以做到以下几点:

cartitem, created = client.cart.items.get_or_create(item=stockitem)

cartitem, created = CartItem.objects.get_or_create(cart=client.cart, item=stockitem)

请查看documentation,了解有关get_or_create其他参数的更多信息。