繁体   English   中英

Django-获取与每个对象相关的所有相关模型

[英]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中,我想显示如下内容:

  • “最早”订购表
  • 将所有orderDetails元素分组到每个orderFK

您能给我指出我所缺乏的例子和理论吗?

如果还没有,请尝试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属性的MetaOrder

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM