我正在使用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张屏幕截图。