Я использую django rest framework для API. И последовал документ здесь .
Вот модель с именем «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
Так что мне нужно получить устройства членов сети с определенным именем или на основе основного = 'Да'. Давайте сосредоточимся на имени в первую очередь.
Таким образом, поток будет -
от участника сети - получить идентификатор основной учетной записи - затем получить идентификатор своей учетной записи для выставления счетов - затем получить устройства - затем выполнить фильтрацию с указанным именем.
Мне удалось сделать это с помощью фильтра django в views.py.
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'. Поэтому, когда я делаю эти фильтры, он должен возвращать только одно устройство для этого конкретного члена сети. Для моего тестирования я жестко закодировал имя, но оно будет динамичным. Но проблема, с которой я сталкиваюсь, заключается в возврате всех устройств для этого члена сети, если найдено имя устройства.
Ex. Если я выполняю поиск по любой другой строке, такой как «random», то получаю пустой результат - это хорошо, потому что нет устройства с таким именем. Но если я буду искать с помощью 'stmk', все устройства будут возвращены. Как я могу ограничить список устройств только устройством 'stmk'. Вот 2 скриншота.