[英]Django - get all related models related to each object
基本上,我确实很少有相互引用的模型。 我希望我之间的关系还好,但我不确定100%。 models.py
class Table(models.Model):
number = models.IntegerField(unique = True)
isFree = models.BooleanField(default = True)
class MenuItem(models.Model):
name = models.CharField(max_length = 200)
price = models.DecimalField(max_digits=5, decimal_places=2)
quantityInStock = models.PositiveSmallIntegerField(default=10)
class Order(models.Model):
tableFK = models.ForeignKey(Table, on_delete=models.CASCADE)
opened_at = models.DateTimeField('date_created', default = timezone.now)
closed_at = models.DateTimeField('date_closed', blank = True, null = True)
paid = models.BooleanField(default = False)
class Meta:
ordering = ('-opened_at',)
class OrderDetails(models.Model):
STATUS_CHOICES = (
('CHOICE1', 'choice1'),
('CHOICE2', 'choice2'),
('CHOICE3', 'choice3'),
('CHOICE4', 'choice4'),
('CHOICE5', 'choice5')
)
orderFK = models.ForeignKey(Order, on_delete = models.CASCADE)
menuitemFK = models.ForeignKey(MenuItem, on_delete = models.CASCADE)
quantity = models.PositiveSmallIntegerField(default = 1)
status = models.CharField(max_length=5, choices= STATUS_CHOICES, default='choice1')
views.py
def index(request):
orders = Order.objects.select_related("tableFK").filter(paid=False)
template = loader.get_template('autowaiter/index.html')
context = {
'orders':orders
}
return HttpResponse(template.render(context))
我现在要实现的是,我确实具有Orders对象。 但是在index.html中,我想显示如下内容:
您能给我指出我所缺乏的例子和理论吗?
如果还没有,请尝试django_tables2 ,可以根据超链接到新页面或新表的方式使用超链接的列来生成和呈现HTML表。
假设我已经了解了您要查找的内容,那么基于当前模型结构的非常简单的模板可能如下所示:
{% for table in tables %}
<h3>Table {{ table.number }}</h3>
<p>Order opened at {{ table.orders.earliest.opened_at }}</p>
{% for orderdetail in table.orders.earliest.orderdetails.all %}
Status: {{ orderdetail.status }}, Quantity: {{ orderdetail.quantity }}
</br>
{% endfor %}
<hr/>
{% endfor %}
但是您需要对模型进行一些调整以支持这一点,即在Order
外键字段中添加related_name
属性:
tableFK = models.ForeignKey(Table, related_name='orders', on_delete=models.CASCADE)
并在OrderDetail
:
orderFK = models.ForeignKey(Order, related_name='orderdetails', on_delete = models.CASCADE)
以及添加get_latest_by
属性的Meta
类Order
:
class Meta:
ordering = ('-opened_at',)
get_latest_by = 'opened_at'
(支持earliest
使用)。
最后,您视图中的查询将需要查询具有未付款订单的顶级Table
对象,而不是查询订单本身:
def index(request):
# Query the tables with unpaid orders
tables = Table.objects.filter(orders__paid=False)
template = loader.get_template('autowaiter/index.html')
context = {
'tables': tables
}
return HttpResponse(template.render(context))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.