在 Django 中搜索带有项目计数的购物车 M2M 模型



我正在尝试为我的一个宠物项目创建购物车系统。

我有Profile模型,它是内置User模型的扩展。我的Profile模型具有shopping_cart字段,该字段是M2M与另一个应用程序的模型的关系Clothing该模型代表我的产品。在代码中,Profile模型如下所示:

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
...
shopping_cart = models.ManyToManyField(
to=Clothing,
related_name="shopping_cart",
blank=True
)

要将新项目添加到shopping_cart字段中,我使用request对象,该对象具有user对象,而该对象又具有我需要的profile

request.user.profile.shopping_cart.添加(项(

所以,我想让用户将同一项目的多个实例添加到shoping_cart,然后计算用户在他的shopping_cart中有多少项目和哪些项目,可能来自collectionsCounter

然后,如果我添加比方说,3 个项目要shopping_cart,我希望输出如下(来自collectionsCounter(:

计数器({<Clothing: 14VQv52T2409iXGC7958>: 3}(

但我得到了这个:

计数器({<Clothing: 14VQv52T2409iXGC7958>: 1}(


现在,谁能解释为什么会发生这种情况,因为我认为 M2M 意味着我可以添加同一项目的多个实例,它将显示所有添加的项目。
UPD 1: 中间型号:
class ShoppingCart(models.Model):
item = models.ForeignKey(to=Clothing, on_delete=models.CASCADE)
in_profile = models.ForeignKey(to="Profile", on_delete=models.CASCADE)
count = models.PositiveSmallIntegerField(
default=1,
blank=False,
null=False
)
def __str__(self):
return self.item.title

我处理请求的部分:

def proceed_request(self, request):
item = Clothing.objects.get(pk=request.POST.get("id"))
related_field = request.user.profile.shopping_cart
if item and item in related_field.all():
related_field.count() += 1 # Throws 'SyntaxError: can't assign to function call' error.
related_field.save()
messages.add_message(request, messages.SUCCESS, f"{item.title} has successfully uppdated!")
return HttpResponse(status=200)
related_field.add(item)
messages.add_message(request, messages.SUCCESS, f"{item.title} has successfully added to {self.verbose_field_name}!")
return HttpResponse(status=200)

UPD 2: 更新了proceed_request功能。现在一切正常。

def proceed_request(self, request):
item = Clothing.objects.get(pk=request.POST.get("id"))
related_model = request.user.profile.shopping_cart
if item and item in related_model.all():
cart_item = ShoppingCart.objects.get(item=item)
cart_item.count += 1
cart_item.save()
messages.add_message(request, messages.SUCCESS, f"{item.title} has successfully uppdated!")
return HttpResponse(status=200)
ShoppingCart.objects.create(item=item, in_profile=request.user.profile)
messages.add_message(request, messages.SUCCESS, f"{item.title} has successfully added to {self.verbose_model_name}!")
return HttpResponse(status=200)

使用 M2M,您可以添加多个不同的服装项目,但多次添加相同的项目不会重复关系。 查看如何使用through向关系添加count字段:

https://docs.djangoproject.com/en/3.0/topics/db/models/#extra-fields-on-many-to-many-relationships

最新更新