具有反向关系的Django过滤器

时间:2018-06-28 08:00:34

标签: django django-rest-framework

我正在使用django rest框架开发API。然后是文档here

这里是一个名为“ NetworkMember”的模型。

class NetworkMember(CommonInfo):
    name = models.CharField('name',max_length=255, blank=True, null=True, default=None)
    status = models.CharField(max_length=50, choices=NETWORK_STATUS_OPTS, default=None)
    network = models.ForeignKey(Network, related_name='network_members', on_delete=models.CASCADE, default=None)
    sender = models.ForeignKey(Account, related_name='sender', on_delete=models.CASCADE, default=None)
    receiver = models.ForeignKey(Account, related_name='receiver', on_delete=models.CASCADE, default=None)
    def __str__(self):
        return self.name

问题仅与“接收者”字段有关。因此,下面是相关的“帐户”模型。

class Account(CommonInfo):
    name = models.CharField(max_length=50)
    is_master_ma = models.CharField(max_length=10, choices=IS_MASTER_MA_OPTS, blank=True, null=True,default=None)
    account_type = models.CharField(max_length=50, choices=ACCOUNT_TYPE_OPTS)
    master_account = models.ForeignKey('self', related_name='masterMA',on_delete=models.CASCADE, blank=True, null=True,default=None)
    billing_account = models.ForeignKey('self', related_name='BA',on_delete=models.CASCADE, blank=True, null=True,default=None)
    def __str__(self):
        return self.name

一个计费帐户可以有一个主帐户。同样,一个主帐户可以具有多个子用户帐户。因此,“帐户”模型中有2个自我关系-master_account和billing_account。

现在,网络成员与主帐户相关。 我们也有一些设备。并且设备与计费帐户相关。这是设备型号。

class Device(CommonInfo):
    name = models.CharField(max_length=250)
    unique_id = models.CharField(max_length=100)
    status = models.CharField(max_length=50, choices=DEV_STATUS_OPTS, blank=True, null=True, default=None)
    billing_account = models.ForeignKey(Account, related_name='ba_devices', on_delete=models.CASCADE, blank=True, null=True, default=None)
    primary = models.CharField(max_length=50, choices=DEV_PRIMARY_OPTS, blank=True, null=True, default=None)
    def __str__(self):
        return self.name

因此,我需要获取具有特定名称或基于primary ='Yes'的网络成员的设备。让我们先关注名字。 因此流程将是-

从网络成员中

-获取主帐户ID-然后获取其计费帐户ID-然后获取设备-然后使用提供的名称进行过滤。

我已经通过在views.py中使用django过滤器来做到这一点。

network_accepted = NetworkMember.objects.filter(network=nid, sender=uid, status="Accepted", receiver__billing_account__ba_devices__name = 'stmk')

然后导入Q并尝试以下方法。

network_accepted = NetworkMember.objects.filter(Q(network=nid, sender=uid, status="Accepted")).filter(Q(receiver__billing_account__ba_devices__name = 'stmk'))

network_accepted = NetworkMember.objects.filter(Q(network=nid, sender=uid, status="Accepted") & Q(receiver__billing_account__ba_devices__name = 'stmk'))

network_accepted = NetworkMember.objects.filter(Q(network=nid, sender=uid, status="Accepted") & Q(receiver__billing_account__ba_devices__name__startswith = 'stmk'))

network_accepted = NetworkMember.objects.filter( Q(receiver__billing_account__ba_devices__name__iexact = 'stmk'))

network_accepted = NetworkMember.objects.filter( Q(receiver__billing_account__ba_devices__name__startswith = 'stmk'))

只有一个名为“ stmk”的设备。因此,当我执行这些筛选器时,该筛选器应仅针对该特定网络成员返回一个设备。在测试中,我已经对该名称进行了硬编码,但是它是动态的。但是我面临的问题是,如果找到了设备名称,它将返回该网络成员的所有设备。

例如如果我使用“ random”之类的其他字符串进行搜索,则结果为空-很好,因为没有使用该名称的设备。但是,如果我搜索“ stmk”,它将返回所有设备。如何将设备列表限制为仅“ stmk”设备。这是2张屏幕截图。

enter image description here

enter image description here

0 个答案:

没有答案