Django get_or_create 关于反向关系

Django get_or_create on reverse relationship

我想使用 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)

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

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

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 需要的其他参数的更多信息。