Django запрашивает модель, которая участвует в общем отношении

Здесь у меня 2 модели, Компания и UserSupervision. Компания связан как внешний ключ с общей моделью отношения UserSupervision.

Я хочу получить следующий запрос:

Company.objects.filter(**{'usersupervision__content_type': Company,
                          'usersupervision__user': some_user,
                          'usersupervision__date_cancelled': None})

Итак, я хочу, чтобы все компании some_user появились в модели UserSupervision. Я знаю, что Компания и UserSupervision не связаны напрямую, поэтому я подумал, может быть, мне придется использовать необработанный sql с объединениями? Или другое более подходящее решение?

class Company(models.Model):
    id = models.UUIDField(blank=True, editable=False, primary_key=True, default=uuid.uuid4)
    name = models.CharField(max_length=150, unique=True)

    users = models.ManyToManyField(User, related_name='companies', through='CompanyMembership')
    date_created = models.DateTimeField('created date', blank=True, editable=False, auto_now_add=True)
    date_updated = models.DateTimeField('updated date', blank=True, editable=False, auto_now=True)


class UserSupervision(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    supervision = models.ForeignKey(Supervision, on_delete=models.SET_NULL, null=True)

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.UUIDField()
    content_object = GenericForeignKey()

    date_assigned = models.DateTimeField('assigned date', blank=True, editable=False, auto_now_add=True)
    date_cancelled = models.DateTimeField('cancelled date', blank=True, null=True, default=None)
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, вы хотите найти все компании в UserSupervision для определенного UserSupervision.user? Что-то типа:

user_supervisions = UserSupervision.objects.filter(
    content_type=ContentType.objects.get_for_model(Company),
    user=some_user,
    date_cancelled=None
).order_by('content_type_id', 'object_id').distinct('content_type_id', 'object_id')

companies = [us.object_id for us in usersupervisions]  # Loop to create list of company ids.

Вы можете отбросьте order_by и отличное, если вы не используете PostgreSQL, но цикл компаний необходимо изменить для учета повторяющихся записей.

Спасибо за ответ, но я хотел иметь метод запросов или метод raw-sql, потому что первая выборка из базы данных и снова фильтрация с помощью python - это работа, потребляющая время и память, я знал, что могу сделать это с помощью такого рода простых споров вокруг , но было бы лаконичнее и точнее, если бы выполнялся только однократный запрос с фильтрацией, в любом случае спасибо :)

Bedilbek 19.11.2018 18:49

Другие вопросы по теме