Фильтр Джанго с обратной связью - PullRequest
0 голосов
/ 28 июня 2018

Я использую 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 скриншота.

enter image description here

enter image description here

...