Django model.objects.filter 无法正常工作

问题描述 投票:0回答:1

所以我正在尝试使用这个:

def get_queryset(self, *args, **kwargs):
        return OrderItem.objects.filter(order_id=self.kwargs['pk'])

按对象搜索我的

OrderItem
,并仅返回通过
order_id
链接到指定订单的对象。

但是使用 Django debug_toolbar 我可以看到 sql 查询正在做什么,它正在执行以下操作:

SELECT "littlelemonAPI_orderitem"."id",
       "littlelemonAPI_orderitem"."order_id",
       "littlelemonAPI_orderitem"."menuitem_id",
       "littlelemonAPI_orderitem"."quantity"
  FROM "littlelemonAPI_orderitem"
 WHERE ("littlelemonAPI_orderitem"."order_id" = 2 AND "littlelemonAPI_orderitem"."id" = 2)
 LIMIT 21

在本例中,我在 API 端点中传递了 2 作为 PK,但我不明白为什么它要按

id
进行搜索,而我只希望它按
order_id
进行搜索。

这些是我的数据库表: enter image description here enter image description here

这也是这两个模型的定义方式:

class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    delivery_crew = models.ForeignKey(User,on_delete=models.SET_NULL,related_name='delivery_crew',null=True)
    status = models.BooleanField(db_index=True, default=0)
    total = models.DecimalField(max_digits=6,decimal_places=2)
    date = models.DateField(db_index=True,auto_now_add=True)
    
    def __str__(self):
        return f"{self.id}"

class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADEAlso)
    menuitem = models.ForeignKey(MenuItem,on_delete=models.CASCADE)
    quantity = models.SmallIntegerField()
    
    class Meta:
        unique_together = ('order','menuitem')
    
    def __str__(self):
        return f"{self.order_id}"

这些是我正在使用和将要使用的序列化器,但我不确定它们如何导致此问题:

class OrderSerialzier(serializers.ModelSerializer):
    user = UserSerializer
    class Meta:
        model = Order
        fields = ['id','user','total','status','delivery_crew','date']
    
class OrderItemHelperSerialzier(serializers.ModelSerializer):
    class Meta:
        model = MenuItem
        fields = ['title','price']
        
class OrderItemSerializer(serializers.ModelSerializer):
    menuitem = OrderItemHelperSerialzier
    class Meta:
        model = OrderItem
        fields = ['menuitem','quantity']
        depth =1 

class OrderAddSerializer(serializers.ModelSerializer):
    class Meta:
        medel =Order
        fields = ['delivery_crew']

我并没有真正厌倦其他任何事情,因为我似乎无法在网上找到有关此问题的任何信息。

django django-models django-rest-framework django-views
1个回答
0
投票

我认为您提供的代码没有问题。您从工具栏中获取的 SQL 查询是视图中“检索”操作中使用的“get”方法的结果。这就是为什么最终的查询集看起来像这样:

OrderItem.objects.filter(order_id=self.kwargs['pk']).get(pk=<lookup_value>)

© www.soinside.com 2019 - 2024. All rights reserved.