Как аннотировать значение определенного связанного поля - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь оптимизировать некоторый код. У меня есть модель со многими связанными моделями, и я хочу аннотировать и фильтровать по значению поля определенного типа этих связанных моделей, так как они предназначены для общего использования. Я могу найти все экземпляры типа связанной модели, которую я хочу, или все модели, связанные с родителем, но не связанную модель определенного типа, связанную с родителем. Кто-нибудь может посоветовать?

Я изначально пробовал

parents = parent.objects.all()
parents.annotate(field_value=Subquery(related_model.objects.get(
                                     field__type='specific',
                                     parent_id=OuterRef('id'),
                                    ).value)))

Но получаю ошибку This queryset contains a reference to an outer query and may only be used in a subquery. Когда я пытался

parents = parent.objects.all()
parents.annotate(field_value=Q(related_model.objects.get(
                              field__type='specific',
                              parent_id=F('id'),
                             ).value)))

, я получал DoesNotExist: related_field matching query does not exist., который кажется ближе, но все еще не работает.

Структура модели:

class parent(models.Model):
    id = models.IntegerField(null=False, primary_key=True)

class field(models.Model):
    id = models.IntegerField(null=False, primary_key=True)
    type = models.CharField(max_length=60)

class related_model(models.Model):
    parent = models.ForeignKey(parent, on_delete=models.CASCADE, related_name='related_models')
    field = models.ForeignKey(field, on_delete=models.CASCADE, related_name='fields')

Это то, что я хочу сделатьдаже возможно?

1 Ответ

0 голосов
/ 02 октября 2019

Неважно, я решил сделать обратный поиск, вроде

parent_ids = related_model.objects.filter(field__type='specific', parent_id__in=list_of_parents).values_list('parent_id')

parents.objects.filter(id__in=parents_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...