比较两个独立模型中的两个相似字段

时间:2015-04-02 16:33:33

标签: python django postgresql django-models orm

鉴于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中的任何主机。我现在有一个工作方法,我使用python解析这些数据,然后将其保存到django中的自己的模型,但我必须相信我可以使用模型本身(我认为会更多)效率也很高。)

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

EDIT1

完全开放模型关系作为某种形式的答案。

EDIT2

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

EDIT3

另外有办法做多种soapAPI或其他什么吗?实际上,我需要返回soapAPI.soap_host 中缺少restAPI.rest_host的整个soapAPI.soap_state模型,而 {{1}}是' Live'。

2 个答案:

答案 0 :(得分:0)

它应该是这样的:

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)

希望这有帮助!

答案 1 :(得分:0)

考虑到@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)

不确定哪种技术更好,因为我无法真正辨别出返回时间的差异,但是嘿工作解决方案。