Django - возможно ли быстро закодировать этот запрос с помощью моделей Django? - PullRequest
0 голосов
/ 26 января 2012

У меня установлены эти модели в Django:

class SourceBusiness(models.Model):
    source = models.CharField(max_length=100)
    ...(other fields)

class ResultBusiness(models.Model):
    sourcebusiness = models.ForeignKey(SourceBusiness)
    ...(other fields)

Я хочу получить список различных источников, для которых существуют объекты в таблице ResultBusiness. Например, для следующих данных

a = SourceBusiness(source="A")
a1 = SourceBusiness(source="A")
b = SourceBusiness(source="B")
c = SourceBusiness(source="C")

x = ResultBusiness(sourcebusiness=a)
y = ResultBusiness(sourcebusiness=a1)
z = ResultBusiness(sourcebusiness=c)

Я хочу обнаружить, что ResultBususiness существуют для источников a, a1 и c, а источниками для этих SourceBususiness являются «A» и «C». В идеале я хотел бы получить ["A", "C"] за один шаг. Возможно ли это с помощью API Django QuerySet?

Если это не так просто, я могу обойти, просто хочу знать, можно ли это сделать за один шаг.

РЕДАКТИРОВАТЬ: просто чтобы уточнить, ["A", "C"] это результат, который я хочу, а не ввод. Таким образом, не «какой ResultBusiness поступает из SourceBusiness с источником в [A, C]», а «для всех существующих ResultBusiness, каковы возможные значения их родительского SourceBusiness.source»

Ответы [ 3 ]

3 голосов
/ 26 января 2012
results = SourceBusiness.objects.filter(resultbusiness__isnull=False).distinct().values_list('source', flat=True)
1 голос
/ 26 января 2012

Прочтите тему https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects, чтобы узнать, как делать такие запросы.

Вы должны сделать что-то вроде этого:

from django.db.models import Q

q = ResultBusiness.objects.filter(
   Q(sourcebusiness__source="A")|Q(sourcebusiness__source="C")
)
1 голос
/ 26 января 2012
RB=ResultBusiness.objects.exclude(sourcebusiness__isnull=True).values_list('sourcebusiness__source',flat=True).distinct()

Это один шаг.

Предположение: ForeignKey может быть null=True

...