Django - 比较两个Querysets / models中的匹配列?

时间:2018-03-02 13:38:23

标签: python django

我有两个型号。 sitesubnets和devicesubnets。

我想比较两个模型,这样我就可以创建两个列表。一个列表将具有匹配的子网,其中一个将具有不匹配的子网

我尝试使用设置差异,但由于它们是不同的模型,我认为它不起作用

测试查询:

sitesubnet_data = SiteSubnets.objects.filter(site_id=site_id)
devicesubnet_data = DeviceSubnets.objects.filter(device_id=device_id)

data = set(sitesubnet_data).difference(set(devicesubnet_data))

当我将sitesubnet_data与数据进行比较时,它们是相同的

我的模特:

class SiteSubnets(models.Model):
    site = models.ForeignKey(SiteData, on_delete=models.CASCADE)
    subnet = models.ForeignKey(Subnets, on_delete=models.CASCADE)

    class Meta:
        verbose_name = "Site Subnets"
        verbose_name_plural = "Site Subnets"
        unique_together = ('site', 'subnet',)


class DeviceSubnets(models.Model):
    device = models.ForeignKey(DeviceData, on_delete=models.CASCADE)
    subnet = models.ForeignKey(Subnets, on_delete=models.CASCADE)

    class Meta:
        verbose_name = "Device Subnets"
        verbose_name_plural = "Device Subnets"
        unique_together = ('device', 'subnet',)  

1 个答案:

答案 0 :(得分:1)

据我所知,我们只能比较相同的类对象(模型对象)。因此,您应该生成两个不同的Subnets类查询集,这两个模型对于两个模型都是通用的。所以我为你的问题找到了一个可能的解决方案,即

devicesubnet = Subnets.objects.filter(devicesubnets__device_id=device_id)
sitesubnet = Subnets.objects.filter(sitesubnets__site_id=site_id)
common_subnets = list(set(devicesubnet) & set(sitesubnet))



此处common_subnets将保留结果,其中包含Subnets模型和SiteSubnets模型的常见DeviceSubnets个实例