Django查询两种型号和双重循环



我正在尝试在合并两个型号的数据时做正确的干方法...我使用QuerySet,使用类变量作为外键,然后我只能访问一个实例。我确实得到了实例数量的计数:

nb_postal_codes = LocalModel.objects.filter(postalcode__icontains="J3L").count()

这为我提供了单个不同的邮政编码的总数,该邮政编码由3个首字母进行了6次过滤。我能够合并数据的唯一方法是使用两个连续的for循环...如本示例...

cp = LocalModel.objects.values_list("cp", "city_name", "latitude")
sd_cp = AddressList.objects.values_list("sd_cp", flat=True)
nb = 0

for k in sd_cp:
    for v in cp:
        if k == v[0]:
            nb += 1
            print(f"Nb: {nb} CP : {v[0]} City: {v[1]} Latitude: {v[2]}")

它确实可以。我的问题...除了使用我的双for循环外...我是否缺少有关使用查询集和经理的正确方法的基本内容?它们必须是一种更好的Pythonic方法:)

您不需要进行两个循环。您可以只使用ORM QuerySet来实现您在模型之间存在外键关系的一个查询中尝试的目标。

请参阅Django通用关系

找到了解决方案。问题是我缺乏对可以在模型之间创建的简单链接的理解,您可以使用这些链接来获取其他变量。外键最多是在模型表格中创建的。因此,无需双循环。

她是正确的方法,使用添加到其他模型键的名称的双重下划线。

这是Bdsondage模型的一部分:

类Bdsondage(Models.Model(:

order = ['date_cre']
user = models.ForeignKey(
    User, on_delete=models.CASCADE)
loccp = models.ForeignKey(BdLocCP,
    null=True, blank=True, on_delete=models.CASCADE)
loccp_flag = models.PositiveSmallIntegerField(
    default=1, blank=True, null=True)   
locad = models.ForeignKey(BdLocAD, 
    null=True, blank=True, on_delete=models.CASCADE)
locad_flag = models.PositiveSmallIntegerField(
    default=1, blank=True, null=True)   

...

使用此链接的视图文件...

类Rapportloc(TemplateView(:

def get(self, request):
    if request.user.is_staff:
        data_users = User.objects.values_list("username", "id", named=True)
        data_tab01 = dSondage.objects.all().filter(user_id__gte="1").values_list(
            "id", "cp", "city_name", "locad__latitude",
            "locad__longitude", named=True).order_by('id')

        data_context = {
        "data_users": data_users,
        "data_tab01": data_tab01,
        }
        return render(request, "localisation/rapport_loc.html", data_context)
    else:
        return Http404("This page does not exist...")

感谢WebbyFox的先前建议。

最新更新