【问题标题】:how to filter a model objects by related table's foreign key in django REST如何在 django REST 中通过相关表的外键过滤模型对象
【发布时间】:2018-10-05 16:00:49
【问题描述】:

我想做一个餐厅的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。所以 Order 类的table_id 字段应该是models.ForeignKey 而不是models.OneToOneField,我是这么认为的! :) 如果有错请告诉我。

提前致谢。

【问题讨论】:

    标签: django django-models django-rest-framework django-filter


    【解决方案1】:

    试试这个,

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


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

    【讨论】:

    • 谢谢@Jerin,我将 'id' 更改为 'table_id' 现在效果很好。
    【解决方案2】:

    我从您的模型中了解到的是,Table 永远不会获得新条目,并且您根据具有 Table 生成新的 Order >is_free 设置为 TRUE

    因此,为了从 table_id 中获取 Order,您需要一些字段,您可以通过该字段获取该 Table 的最新订单。 现在你有 order_id 但我不建议你这样做。最好的方法是在类 Order 中添加一些日期/时间字段。

    您的查询可能类似于:

    SELECT * FROM OrderDetail WHERE order_id = (SELECT order_id FROM Order WHERE table_id = <table_id> ORDER BY date_time DESC LIMIT 1)
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2015-09-10
      • 2021-11-17
      • 2017-07-27
      • 1970-01-01
      • 2013-09-23
      • 2018-04-27
      相关资源
      最近更新 更多