我正在尝试为我的一个宠物项目创建购物车系统。
我有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
中有多少项目和哪些项目,可能来自collections
Counter
。
然后,如果我添加比方说,3 个项目要shopping_cart
,我希望输出如下(来自collections
Counter
(:
计数器({
<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