【问题标题】:django templates loop two querysetsdjango模板循环两个查询集
【发布时间】:2023-04-09 12:15:01
【问题描述】:

我正在尝试获取两个查询集的详细信息并显示在我的数据表上。我可以显示第一个查询集的详细信息,但不能显示第二个查询集的详细信息,这也取决于第一个查询集。

我的views.py函数;

def truck_list(request):
   q_data = quar_contacts.objects.all().filter(.....)
   hot_details = []
   for d in q_data:
      h_details = truck_contacts.objects.filter(p_contacts=d.id)        
      hot_details.append(h_details)

   my_list_data = zip(q_data, hot_details)
   data = {'quar_data': my_list_data}

   return render(request, 'syst/truck_list.html', data)

我可以将 zip 列表的详细信息打印为元组,即 data = tuple(my_list_data) 并查看数据。

然后是数据表正文部分上的我的 truck_list 模板:

  <tbody>
    {% for q_data, hot_details in quar_data %}
        <tr>
           <td>{{ q_data.last_name }}</td>
           <td>{{ q_data.first_name }}</td>
           <td>{{ q_data.age }}</td>
           <td>{{ q_data.sex }}</td>
           <td>{{ q_data.phone_number }}</td>
           <td>{{ hot_details.hotel_name}}</td>                 
           <td>{{ hot_details.date_check_in }}</td>
           <td>{{ hot_details.created_by }}</td>
        </tr>
    {% endfor %}
   </tbody>

如何在我的数据表上显示 hot_details(hotel_name 和 date_checked_in)。我如何为每个联系人循环提供哪些酒店详细信息。

有没有更简单的方法来实现这一点?

我的模特:

class quar_contacts(models.Model):

    first_name = models.CharField(max_length=50)
    middle_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50)
    sex = models.CharField(max_length=50)
    dob = models.DateField(default=date.today)
    passport_number = models.CharField(max_length=50, blank=True)
    created_by = models.ForeignKey(User, on_delete=models.DO_NOTHING, related_name='quar_updated_by')

class truck_contacts(models.Model):

    patient_contacts = models.ForeignKey(quar_contacts, on_delete=models.DO_NOTHING, related_name='truck_contact')
    vehicle_registration = models.CharField(max_length=50, blank=True)
    company_name = models.CharField(max_length=50, blank=True)
    hotel = models.CharField(max_length=50, blank=True)
    hotel_town = models.CharField(max_length=50, blank=True)
    date_check_in = models.DateField(default=date.today)
    date_check_out = models.DateField(default=date.today)

另外,你如何获得'created_by'值,它是用户表的外键?

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    您可以使用annotatequar_contacts 查询集中的每个对象添加其他字段。我不知道您的数据库架构,但如果“quar 联系人”有一个“卡车联系人”的外键,它可能是这样的:

    from django.db.models import F
    
    q_data = quar_contacts.objects.all().filter(.....).annotate(
        hotel_name=F("your_relation_name__hotel_name"),
        date_check_in=F("your_relation_name__date_check_in"),
    )
    

    然后您可以访问hotel_namedate_check_in,就像来自此对象的其他字段一样。

    如果有帮助,请告诉我。如果您在这些模型之间有不同的关系,我会更新我的答案。

    【讨论】:

    • 谢谢你,我已经编辑了我的模型结构,在上面的问题中包含了我的模型结构,所以“卡车联系人”有一个“qua contact”的外键
    【解决方案2】:

    使用“注释”我设法以另一种方式添加字段。获取“truck_contacts”查询集,然后查找父字段值“quar_contacts”。感谢上面的@rafaljusiak 想法。

    all_data = truck_contacts.objects.all().annotate(
            first_name=F("patient_contacts__first_name"),
            last_name=F("patient_contacts__last_name"),
            sex=F("patient_contacts__sex"),
            age=F("patient_contacts__dob"),
            passport_number=F("patient_contacts__passport_number"),
            phone_number=F("patient_contacts__phone_number"),
            created_by=F("patient_contacts__created_by"),
        )
    

    但我仍在苦苦挣扎如何显示“创建者”是用户表的外键

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 2018-08-08
      • 2014-03-09
      • 1970-01-01
      • 2018-09-10
      • 2017-12-16
      • 1970-01-01
      • 2014-07-12
      • 2018-12-20
      相关资源
      最近更新 更多