0

hellow my models see the blow

class IP(models.Model):
    subnet = models.ForeignKey(Subnet,verbose_name="SUBNET",on_delete=models.CASCADE,related_name="ip_set")
    ip = models.GenericIPAddressField(verbose_name="IP",protocol="both",unpack_ipv4=True,unique=True)
    asset = models.ManyToManyField(Asset,verbose_name="HOSTNAME",through="AssetIP",related_name="ip_set",blank=True,)
    description = models.CharField(verbose_name="DESCRIPTION",max_length=50,default="",null=True,blank=True)


class AssetIP(models.Model):
    TYPE_CHOICES = [
        ("GATEWAY-IP", "GATEWAY-IP"),
        ("MGT-IP", "MGT-IP"),
        ("PRIMARY-IP", "PRIMARY-IP"),
        ("OTHER-IP", "OTHER-IP"),
    ]
    ip_type = models.CharField(verbose_name="IP TYPE",max_length=30,choices=TYPE_CHOICES)
    ip = models.ForeignKey(IP,verbose_name="IP",on_delete=models.CASCADE,related_name="asset_ip_set")
    asset = models.ForeignKey(Asset,verbose_name="HOSTNAME",on_delete=models.CASCADE,related_name="asset_ip_set")

class Asset(models.Model):    
    barcode = models.CharField(verbose_name="Barcode",max_length=60,blank=True,null=True,unique=True)
    hostname= models.CharField(verbose_name="Hostname",max_length=30)

so in this model data is blow

IP Model

| IP | Asset | Description |
|:---- |:------:| -----:|
| 10.10.10.2  | A_HOST,B_HOST,C_HOST    | - |
| 10.10.10.3  | A_HOST,B_HOST    | - |
| 10.10.10.4  | A_HOST    | - |
| 10.10.10.5  | A_HOST    | - |

AssetIP through Model

| IP | Asset | IP_TYPE |
|:---- |:------:| -----:|
| 10.10.10.2  | A_HOST    | OTHER-IP |
| 10.10.10.2  | B_HOST    | OTHER-IP |
| 10.10.10.2  | C_HOST    | OTHER-IP |
| 10.10.10.3  | A_HOST    | OTHER-IP |
| 10.10.10.4  | A_HOST    | OTHER-IP |
| 10.10.10.5  | A_HOST    | PRIMARY-IP |

So Asset Query Result in this Result = Asset.objects.all() in this result Field

Asset = {
 barcode: "ddd",
 hostname: "A_HOST",
}

I Want Field and Result

Asset = {
 barcode: "ddd",
 hostname: "A_HOST",
 primary_ip : "10.10.10.5",
 other_ip : "10.10.10.2, 10.10.10.3, 10.10.10.4"
}

I Try the this query in this queryset is not filtering "OHTER-IP"

assets = Asset.objects.annotate(other_ips=GroupConcat('asset_ip_set__ip__ip'))
   assets[0].other_ips
   result : '10.10.10.2,10.10.10.3,10.10.10.4,10.10.10.5'

and try to this queryset

    filtered_ips = AssetIP.objects.filter(asset=OuterRef('pk'), ip_type="OTHER-IP").values_list('ip__ip', flat=True)
    Asset.objects.filter(asset_ip_set__ip_type="OTHER-IP").annotate(
        other_ips=GroupConcat(
            Subquery(filtered_ips),
            delimiter=', '
        )
    )
result : django.db.utils.OperationalError: (1242, 'Subquery returns more than 1 row')

Help me....

Jake Nam
  • 33
  • 1
  • 4

0 Answers0