首页 > 解决方案 > 如何在 django REST 中通过相关表的外键过滤模型对象

问题描述

我想为一家餐厅制作一个 API,我models.py是这样的:

class Table(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30, null=False, blank=False)
    is_free = models.BooleanField(default=True)

    def __str__(self):
        return '%s %s %s' % (self.id, self.name, self.is_free)


class Order(models.Model):
    order_id = models.AutoField(primary_key=True)
    table_id = models.ForeignKey(Table, on_delete=models.CASCADE)
    total_price = models.IntegerField()
    factor_id = models.IntegerField()

    def __str__(self):
        return '%s %s %s' % (self.order_id, self.table_id.id, self.total_price)


class OrderDetail(models.Model):
    order_detail_id = models.IntegerField(primary_key=True)
    order_id = models.ForeignKey(Order, on_delete=models.CASCADE)
    food_id = models.ForeignKey(Food, on_delete=models.CASCADE)
    amount = models.IntegerField()
    price = models.IntegerField()

    def __str__(self):
        return '%s %s %s' % (self.order_detail_id, self.order_id, self.food_id.name)

当创建一个带有表的订单时,应该添加一些 OrderDetails。

我想过滤所有针对特定表和最新订单的 OrderDetail 对象(我的意思是所有现在处于活动状态的 OrderDetail 对象)。带有过滤器的客户端请求 URL 包含table_id和不包含order_id. 如何按拥有它的表过滤 OrderDetail 对象?

每个表一次只能有一个订单,当一个订单使用特定的表创建时,is_free将设置为 False。所以table_idOrder 类的字段应该models.ForeignKey不是models.OneToOneField,我想是的!:) 如果有错请告诉我。

提前致谢。

标签: djangodjango-modelsdjango-rest-frameworkdjango-filter

解决方案


尝试这个,

order_detail_queryset = OrderDetail.objects.filter(
    order_id__table_id=table_id,
    order_id=Order.objects.filter(
        table_id=table_id).latest(
        'table_id'))


我没有测试答案,但它可能会按预期工作


推荐阅读