Фильтр, основанный на том, является ли пользователь частью команды проекта

#django #django-models #django-queryset

#джанго #джанго-модели #django-набор запросов

Вопрос:

У меня есть две модели Проекта и пользователя. Команда проекта-это поле «многие ко многим» с пользовательской моделью.

models.py

 # Create your models here. class Project(models.Model):  title = CharField(max_length=30)  description = TextField()  due_date = DateField()  team = ManyToManyField(settings.AUTH_USER_MODEL)  INACTIVE = 0  ACTIVE = 1  STATUS = (  (INACTIVE, ('Inactive')),  (ACTIVE, ('Active')),  )   active = models.IntegerField(default=1, choices=STATUS)   def __str__(self) -gt; str:  return f'{self.title}'  

views.py

 @login_required def index(request):  user = request.user  tickets = Ticket.objects.filter(assigned_to=user)  ticket_count = len(tickets)  projects = Project.objects.filter(team__in = user)  project_count = len(projects)  context = {  'tickets':tickets,  'ticket_count':ticket_count,  'projects':projects,  'project_count':project_count,  }  return render(request, 'bugtracker_app/index.html', context)  

Я пытаюсь использовать API набора запросов для возврата проектов, которым был назначен текущий вошедший в систему пользователь. Однако я получаю следующую ошибку:

 TypeError: 'User' object is not iterable  

Как я могу устранить эту ошибку и получить набор запросов к проектам, над которыми работает пользователь?

Ответ №1:

Эта строка-ваш виновник:

 projects = Project.objects.filter(team__in = user)  

Поскольку это поле ManyToManyField, вам на самом деле не нужно регистрировать __или даже __содержит. Записи, которые вы ищете, будут иметь пользователя в качестве атрибута команды.

Попробуйте это:

 projects = Project.objects.filter(team = user)  

Ответ №2:

Попробуйте изменить свойство команды в модели проекта, чтобы оно было:

 team = ManyToManyField(settings.AUTH_USER_MODEL, related_name= 'user_projects')  

Затем в представлении вы можете использовать

 user.user_projects.all()