Django: получить ValueQuerySet со значениями из общего отношения

#django #django-queryset #generic-relations

#django #django-queryset #общие отношения

Вопрос:

У меня есть две модели, связанные общим отношением:

 from django.contrib.contenttypes import generic
from django.db import models

class Bar(models.Model):
    content_type   = models.ForeignKey(ContentType)
    object_id      = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

    code  = models.CharField(max_length=10)
    value = models.IntegerField()

class Foo(models.Model):
    ... base fields ...
    bars = generic.GenericRelation(Bar)
  

и теперь я хочу получить все ‘bar.value’, код которых ‘xxx’, с синтаксисом типа:

 Foo.objects.filter(...foofilters..., bars__code='xxx').values('bars__value')
  

но это не работает (Django сообщает мне, что ‘bars__value’ не является допустимым полем).

Любой намек?

РЕДАКТИРОВАТЬ: в SQL я бы сделал что-то вроде этого:

 SELECT bar.value
FROM   foo 
JOIN   django_content_type AS ct
    ON ct.app_label = 'foo_app'
   AND ct.model = 'foo'
JOIN   bar 
    ON bar.content_type_id = ct.id
   AND bar.object_id = foo.id
WHERE  bar.code = 'xxx'
  

или получение content_type_id с другим запросом

Ответ №1:

Вы не можете сделать это так… Визуализация того, как sql должен выглядеть в этом случае

Что вам может понадобиться, так это:

 foo_ids = Foo.objects.filter(foo-filters).values_list('id', flat=True) # Getting Foo ids filtered
Bar.objects.filter(
          content_type=ContentType.objects.get_for_model(Foo),
          object_id__in=foo_ids,
          bar-filters
    ).values('value')
  

Комментарии:

1. Моей попыткой для SQL было бы «ВЫБРАТЬ bar.value ИЗ foo JOIN bar В bar.foo_id = foo.id ГДЕ bar.code = ‘xxx’ И …»