如何在django REST

时间:2018-04-25 08:45:59

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

我想为餐馆制作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对象,并且是最新的Order(我的意思是所有现在都处于活动状态的OrderDetail对象)。带过滤器的客户端请求网址包含table_id而非order_id。如何通过具有它的表来过滤OrderDetail对象?

  

每张表一刻只能有一个订单,当订单使用特定表创建时,is_free将设置为False。所以Order类的table_id字段应为models.ForeignKey而不是models.OneToOneField,我想是这样! :)如果有问题请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分: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'))


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

答案 1 :(得分:0)

我从您的模型中了解到,永远不会获得新条目,您会根据生成新的订单 > is_free 设置为 TRUE

因此,为了从 table_id 获取订单,您需要一些字段,您可以通过该字段获取 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)

希望有所帮助。