如何在 Django REST 中通过相关 table 的外键过滤模型对象
how to filter a model objects by related table's foreign key in 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)
创建带有 Table 的订单时,应向其中添加一些订单详细信息。
我想过滤特定 Table 和最新订单的所有 OrderDetail 对象(我的意思是所有现在处于活动状态的 OrderDetail 对象)。带过滤器的客户端请求 URL 包含 table_id
而不是 order_id
。我如何通过 table 过滤 OrderDetail 对象?
Each table can only have one order in a moment, When an Order creates with a specific Table, the is_free
will set to False. So the table_id
field of Order class should be models.ForeignKey
not models.OneToOneField
, I think so! :) If it's wrong please tell me.
提前致谢。
我从你的模型中了解到,Table 永远不会获得新条目,你会根据Table 已将 is_free 设置为 TRUE.
因此,为了从 table_id 获取 Order,您需要一些字段,您可以通过该字段获取最新的Table 的顺序。
现在你有 order_id 但我不建议你这样做。最好的方法可能是在 class Order 中添加一些 Date/Time 字段。
您的查询可能类似于:
SELECT * FROM OrderDetail WHERE order_id = (SELECT order_id FROM Order WHERE table_id = <table_id> ORDER BY date_time DESC LIMIT 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'))
我没有测试答案,但它可能会按预期工作
我想给餐厅做一个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)
创建带有 Table 的订单时,应向其中添加一些订单详细信息。
我想过滤特定 Table 和最新订单的所有 OrderDetail 对象(我的意思是所有现在处于活动状态的 OrderDetail 对象)。带过滤器的客户端请求 URL 包含 table_id
而不是 order_id
。我如何通过 table 过滤 OrderDetail 对象?
Each table can only have one order in a moment, When an Order creates with a specific Table, the
is_free
will set to False. So thetable_id
field of Order class should bemodels.ForeignKey
notmodels.OneToOneField
, I think so! :) If it's wrong please tell me.
提前致谢。
我从你的模型中了解到,Table 永远不会获得新条目,你会根据Table 已将 is_free 设置为 TRUE.
因此,为了从 table_id 获取 Order,您需要一些字段,您可以通过该字段获取最新的Table 的顺序。 现在你有 order_id 但我不建议你这样做。最好的方法可能是在 class Order 中添加一些 Date/Time 字段。
您的查询可能类似于:
SELECT * FROM OrderDetail WHERE order_id = (SELECT order_id FROM Order WHERE table_id = <table_id> ORDER BY date_time DESC LIMIT 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'))
我没有测试答案,但它可能会按预期工作