Задать вопрос

Как сделать ORM запрос?

есть вот такие модели:

class Team(models.Model):
    def __str__(self):
        return self.teamname
    teamname = models.CharField(max_length = 64, verbose_name='Название команды')
    member = models.ManyToManyField(User, verbose_name='Члены команды')

class Task(models.Model):
    def __str__(self):
        return self.tasktitle
    
    STATUS_CHOICE = (
        ("new", "Новый"),
        ("inprogress", "В процессе"),
        ("done", "Готово"),
    )

    TYPE_CHOICE = (
        ('nw', 'Новость'), 
        ('tk', 'Задача'), 
        ('nt', 'Уведомление') 
    )

    tasktitle = models.CharField(max_length = 128, verbose_name='Заголовок')
    description = models.TextField(max_length = 100000, verbose_name='Описание')
    datetoresolve = models.DateField(verbose_name='Срок выполнения')
    status = models.CharField(choices = STATUS_CHOICE, max_length = 10, blank=True, verbose_name='Статус')
    tasktype = models.CharField(choices = TYPE_CHOICE, max_length = 2, default='nt', verbose_name='Тип записи')
    
    resposiblePerson = models.ManyToManyField(User, blank=True, verbose_name='Ответственный сотрудник')
    responsibleTeam = models.ManyToManyField(Team, blank=True, verbose_name='Ответственная команда')
    
    watcher = models.ManyToManyField(User, blank=True, verbose_name='Наблюдатель', related_name='watcher_p')
    helper = models.ManyToManyField(User, blank=True, verbose_name='Помогающий', related_name='helper_p')
    performer =  models.ManyToManyField(User, blank=True, verbose_name='Исполнитель', related_name='peformer_p')


И сейчас мне нужно сформировать ленту для каждого пользователя, в зависимости от того есть ли он в команде, назначен ли таск на него или он находится среди наблюдателей\помогающих\исполнителей

Не представляю как составить такой запрос :(

Так же я понимаю что скорее всего архитектура решения изначально кривая.

Подскажите пожалуйста, как в таких случаях составляют запрос (чтобы определить относится ли таск к человеку), лиюо как лучше изменить модель

Заранее благодарю!

Забыл добавить, что я могу получить по отдельному полю, например:
Task.objects.filter(resposiblePerson__username="gennady")
  • Вопрос задан
  • 102 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
from functools import reduce
import operator

from django.db.models import Q


user = request.user
filters = (
    Q(resposiblePerson=user),
    Q(responsibleTeam__member=user),
    Q(watcher=user),
    Q(helper=user),
    Q(performer=user),
)

tasks = Task.objects.filter(reduce(operator.or_, filters))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы