如何在Django查询集中比较不同模型的两个字段?

问题描述

想比较(如果相同或不相同)“地图”模型的“ map_id”与“ Uni”模型的“ uni_id”,如果相同则返回。注意:模型map和Uni也在不同的数据库中。

下面是两个模型:

 class map(models.Model):
       job_id = models.AutoField(db_column='job_id',primary_key=True)
       company = models.CharField(max_length=255,blank=True,null=True)
       map_id = models.CharField(db_column='Map_ID',max_length=255,null=True)
      
       class Meta:
             managed = True
             db_table = 'Map'


  class Uni(models.Model):
        uni_id = models.BigAutoField(db_column='Uni_ID',primary_key=True)  
        comp_name = models.TextField(blank=True,null=True)
        name = models.TextField(blank=True,null=True)

        class Meta:
              managed = True
              db_table = 'Uni'

我想从值等于Uni的uni_id的地图模型中过滤map_id。 下面是我尝试过的代码

   obj_map = map.objects.using("Map").filter(map_id=pk).filter(map_id__in=F('uni_id'))

解决方法

您可以这样说:

obj_map = map.objects.filter(map_id=pk) if Uni.objects.filter(uni_id=pk).exists() else None

这将检查具有该ID值的 Uni 对象是否存在,如果存在,那么它将尝试查找具有该ID的 map 对象。如果 Uni 对象不存在,或者它存在但具有该ID的 map 对象不存在,则最终将得到None值在您的 obj_map 字段中。使用if obj_map:执行进一步的计算。

注意::对于Python中的类名称,请使用大写约定。将class map(models.Model)更改为class Map(models.Model)。顺便说一句,我不知道该代码的用例是什么,但是比较两个不同模型的唯一ID根本不安全(例如,如果ID字段是自动生成的)。我也不确定您为什么要使用db_table,所以在示例中不加赘述。