【问题标题】:Django query from multiple table base on FK基于 FK 的多表 Django 查询
【发布时间】:2022-11-10 23:13:04
【问题描述】:

嗨,我是 django 编码的新手 我在不同的 Django 应用程序中有 3 个表(模型),我尝试在 htmpl 页面中制作一个简单的报告,因此需要根据外键检索每个项目的特定数据。

通过下面的代码,我可以访问 Html 页面中的机器存储表 做一个循环,但我想从其他表中获取数据并过滤它们,

{% for m in machines %}

    <h2>{{m.title}}</h2>
    <h3>{{}}</h3>.  
         //i** need to access the ordertitle field in tb_order base on machine id. ??**
    <p>{{ }}</p>.   
         // **access ordertitle in tb_order base on status field ??**
{%end for %}`

这是一个view.py

def allmachinesLOGO(request):
    machines=Machine.objects.all()
    context ={'machines':machines}
    return render(request,'pline/machineslogos.html',context)

楷模 :

class tb_order(models.Model):     
    ordertitle= models.CharField(max_length=200) 
    customer=models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL)        
    mould=models.ForeignKey(Mould, null=True, on_delete=models.SET_NULL, blank=True)      
    status=models.CharField(choices=status_choices, default="0", max_length=20)        
    accept=models.BooleanField     
    machine=models.ForeignKey(Machine,null=True, on_delete=models.SET_NULL, blank=True)     
    id =models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False, unique=True)`

class Machine(models.Model):     
    title = models.CharField(max_length=200)     
    machine_model = models.CharField(max_length=200, null=True, blank=True)        
    description = models.CharField(max_length=600, null=True, blank=True)     
    featured_image=models.ImageField(default="defaultmachine.webp", blank=True, null=True)         
    id=models.UUIDField(default=uuid.uuid4, unique=True,primary_key=True,editable=False)`

建议解决方案根据状态字段访问 tb_order 中的 ordertitle ?? // i need to access the ordertitle field in tb_order base on machine id.

【问题讨论】:

    标签: django


    【解决方案1】:

    通过使用主模型,您可以从辅助模型中获取与其关联的数据。为此,默认情况下会在主模型中创建一个名为 secondary model_set 的特殊属性(对象)。在您的情况下,例如:tb_order_set(小写)。为 ForeignKey 使用related_name(在这种情况下,它将是您编写的没有 _set 前缀的任何内容)。

    在模板中,外部循环遍历模型的行:机器。内部的,通过 tb_order_set.all,访问 tb_order 模型的行。尽管在我看来,最好在视图中进行所有计算和比较,而在模板中只显示信息。

    模板

    {% for m in machines %}
    <p>{{ m.tb_order_set.all }}</p>
    {% for r in m.tb_order_set.all %}
    <p>{{ 'ordertitle' }} : {{ r.ordertitle }} {{ 'status' }} : {{ r.status }}</p>
    {% endfor %}
    {% endfor %}
    

    如果需要按特定状态显示:

    {% for m in machines %}
    <p>{{ m.tb_order_set.all }}</p>
    {% for r in m.tb_order_set.all %}
    {% if r.status  == '2' %}
    <p>{{ 'ordertitle' }} : {{ r.ordertitle }} {{ 'status' }} : {{ r.status }}</p>
    {% endif %}
    {% endfor %}
    {% endfor %}
    

    【讨论】:

    • 谢谢你的帮助。我还尝试使用过滤器按状态获取订单,但没有成功。 {% if m.tb_order_set.all.filter(status=='2') %} <h4> 工作</h4> {% else %} <h4>停止</h4>
    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2012-03-29
    • 2018-12-10
    • 1970-01-01
    相关资源
    最近更新 更多