【问题标题】:Compare two alike fields from two separate models比较来自两个不同模型的两个相似字段
【发布时间】:2023-04-11 11:18:01
【问题描述】:

给定 django 1.8、python 2.7.5、postgresql 和以下通用模型:

class restAPI(models.Model):
    rest_id = models.CharField(max_length=20)
    rest_host = models.CharField(max_length=20)
    rest_mode = models.CharField(max_length=20)
    rest_state = models.CharField(max_length=20)


class soapAPI(models.Model):
    soap_id = models.CharField(max_length=20)
    soap_host = models.CharField(max_length=20)
    soap_asset = models.CharField(max_length=20)
    soap_state = models.CharField(max_length=20)

在完美世界中,soapAPI.soap_hostrestAPI.rest_host 将完美匹配。然而,这种情况很少见。我正在尝试查找并返回soapAPI 中存在但不在restAPI 中的任何主机。我目前有一种工作方法,在将这些数据保存到 django 中的自己的模型之前,我使用 python 解析这些数据,但我必须相信我可以使用模型本身来做到这一点(我认为这也会更有效) .

如何使用 django 提供的 orm 或使用 .raw(),最好使用 orm 返回 soapAPIENTIRE 模型,其中 restAPI.rest_host 中缺少 soapAPI.soap_host?任何和所有的帮助都将不胜感激,因为这对我来说是一次学习经历。提前谢谢你。

EDIT1

完全开放地将关系建模为某种形式的答案。

EDIT2

保持开放,因为我必须相信有比多个查询集更好的方法。

EDIT3

另外有没有办法做多个__in 之类的?我实际上需要返回整个soapAPI 模型,其中restAPI.rest_host 中缺少soapAPI.soap_host AND soapAPI.soap_state 是“实时”。

【问题讨论】:

    标签: python django postgresql django-models orm


    【解决方案1】:

    鉴于@HassenPy 给出的答案,这是我能想到的最好的:

    excludehosts = restAPI.objects.values_list('rest_host', flat=True)
    missinghosts = soapAPI.objects.exclude(soap_host__in=excludehosts)
    

    编辑

    回答我自己的编辑 3,这是我能想到的最好的:

    excludehosts = restAPI.objects.values_list('rest_host', flat=True)
    missinghosts = soapAPI.objects.exclude(soap_host__in=excludehosts)
    missinghosts.filter(soap_state='Live')
    

    尽管以下方法也有效:

    excludehosts = restAPI.objects.values_list('rest_host', flat=True)
    soapAPI.objects.filter(soap_state='Live').exclude(soap_host__in=excludehosts)
    

    不确定哪个在技术上更好,因为老实说,我无法确定返回时间的差异,但嘿,可行的解决方案。

    【讨论】:

      【解决方案2】:

      应该是这样的:

      rest_hosts = restAPI.objects.only("rest_host")
      excluded_rest_hosts = [host.rest_host for host in rest_hosts]
      missing_soap_hosts = soapAPI.objects.exclude(soap_host__in=excluded_rest_hosts)
      

      希望这会有所帮助!

      【讨论】:

      • 无论出于何种原因我得到这个:FieldError: Cannot resolve keyword 'rest_host' into field. Choices are: id, soap_asset, soap_host, soap_id, soap_state
      • 用更少的代码解决了这个问题。看我的回答。谢谢你让我开始,你的帮助很有帮助。现在,如果我只能在一个查询集中弄清楚如何做到这一点。
      • 我没有看到任何答案 O.o
      • 您正在寻找 1 queryset 或 1 query 的解决方案?因为您发布的(带有values_list 已经是一个query 解决方案。
      • @Todor 抱歉,尽可能尝试 1 个查询集。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多