Django Как запросить отношения ManyToMany, где все объекты совпадают - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть следующие модели:

## Tags for issues
class issueTags(models.Model):
    name = models.CharField(max_length=400)
class issues(models.Model):
    tags = models.ManyToManyField(issueTags,blank = True)

На мой взгляд, я получаю массив из некоторого клиентского JavaScript, т.е.

(Pdb) array_data = request.POST['arr']
(Pdb) array_data
'["2","3"]'

Как мне отфильтровать объект проблем, чтобы найти всепроблемы, которые соответствуют всем тегам в массиве?(2,3 являются значениями идентификатора для tag__id.

Если есть лучший способ упорядочить объекты, которые также будут работать, чтобы я мог искать таким образом.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Это не самое элегантное или питонное решение, но в итоге я просто зациклился на получающемся фильтре.

def filter_on_category(issue_object,array_of_tags):
    #keep filtering to make an and
    i = 0
    current_filter = issue_object
    while (i < (len(array_of_tags))):
        #lets filter again
        current_filter=current_filter.filter(tags__id__in=array_of_tags[i])
        i=i+1

    return current_filter
0 голосов
/ 20 ноября 2018

Я не проверял это, но я думаю, что вы могли бы сделать следующее:

from django.db.models import Q

array_data = array_data.split(',')
issues.objects.filter(
    tags__in=array_data,
).exclude(
    # Exclude any that aren't in array_data
    ~Q(tags__in=array_data)
).annotate(
    matches=Count(tags, distinct=True)
).filter(
    # Make sure the number found is right.
    matches=len(array_data)
)

К вашему сведению, вы должны использовать Issue, IssueTag для имен вашей модели, чтобы следовать шаблону именования Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...