【问题标题】:how to compare two fields of different models in Django query-set?如何比较 Django 查询集中不同模型的两个字段?
【发布时间】:2021-01-02 02:07:51
【问题描述】:

想要比较(是否相同)'map'模型的'map_id'和'Uni'模型的'uni_id',如果它们相同则返回。注意:models 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, blank=True, 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'

我想从地图模型中过滤 map_id,它的值等于来自 Uni 的 uni_id。 以下是我尝试过的代码:

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

【问题讨论】:

    标签: django django-views django-queryset django-filter django-aggregation


    【解决方案1】:

    你可以这样说:

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

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

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

    【讨论】:

    • 嗨@Aleksandar Mijatović 感谢您的回答,无论如何我解决了我的问题。关于python类的名称,它在我的代码中的大写,我刚刚在这里发布了演示代码,这就是为什么类名是小写的。
    • 很高兴听到您解决了这个问题!无论如何,如果您认为此答案有帮助,请给它一个赞成票或绿色勾号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2012-09-05
    • 2017-12-17
    • 2013-10-10
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多