【问题标题】:Confusion of codes in the django views partdjango 视图部分中的代码混淆
【发布时间】:2020-05-21 12:10:39
【问题描述】:
class Item(models.Model):
    title = models.CharField(max_length=100)
    price = models.FloatField()
    discount_price = models.FloatField(blank=True, null=True)
    category = models.CharField(choices=category_choices, max_length=2)
    label = models.CharField(choices=label_choices, max_length=1)
    slug = models.SlugField()
    description = models.TextField()


    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("product", kwargs={
            'slug': self.slug
        })

    def get_add_to_cart_url(self):
        return reverse("add-to-cart", kwargs={
            'slug': self.slug
        })



class OrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE,null=True)
    ordered = models.BooleanField(default=False)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return f"{self.quantity} of {self.item.title}"




class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)

    items = models.ManyToManyField(OrderItem)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField()
    ordered = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username




 def add_to_cart(request, slug):
        item = get_object_or_404(Item, slug=slug)
        order_item, created = OrderItem.objects.get_or_create(
            item=item,
            user=request.user,
            ordered=False
        )
        order_qs = Order.objects.filter(user=request.user, ordered=False)
        if order_qs.exists():
            order = order_qs[0]
            # check if the order item is in the order
            if order.items.filter(item__slug=item.slug).exists():
                order_item.quantity += 1
                order_item.save()
            else:
                order.items.add(order_item)
        else:
            ordered_date = timezone.now()
            order = Order.objects.create(user=request.user, ordered_date=ordered_date)
            order.items.add(order_item)
        return redirect("product",slug=slug)

我正在学习它。在上面我正在尝试将产品添加到购物车。首先,我将获取特定 slug 的对象,然后将其存储在 OrderItem 类中。但我很困惑:如果 order.items.filter(item__slug=item.slug).exists():这条线有效。 slug 前的双取消划线有什么作用?

【问题讨论】:

    标签: django django-models django-rest-framework django-forms django-views


    【解决方案1】:

    这是一种跨越关系的查找。 documentation 在这方面是一流的。

    基本上,在这种情况下,您可以想象双下划线所在的 .

    order.items.filter(item__slug=some_slug)
    

    会是这样的(但不要这样做,它很慢!)

    [item for item in order.items if item.slug == some_slug]
    

    【讨论】:

    • 是的,我明白了,制作 order=False 的目的是什么
    猜你喜欢
    • 2017-03-01
    • 2020-09-05
    • 1970-01-01
    • 2023-04-08
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多