所以我正在尝试使用这个:
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
进行搜索。
这些是我的数据库表:
这也是这两个模型的定义方式:
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']
我并没有真正厌倦其他任何事情,因为我似乎无法在网上找到有关此问题的任何信息。
我认为您提供的代码没有问题。您从工具栏中获取的 SQL 查询是视图中“检索”操作中使用的“get”方法的结果。这就是为什么最终的查询集看起来像这样:
OrderItem.objects.filter(order_id=self.kwargs['pk']).get(pk=<lookup_value>)