Произвольные объединения в моделях Django - PullRequest
0 голосов
/ 13 апреля 2011

Допустим, модель X имеет поле n (целое число).Теперь у меня также есть модель Y, которая имеет поля n и m (целые числа).Можно ли с помощью Django ORM выбрать x (модель X) таким образом, чтобы существовало y (модель Y), таким образом, что x.n = y.n и y.m = m для данного значения m?

Пожалуйста, не советуйте мне вводить ForeignKey отношения между двумя моделями или что-то в этом роде.Я хотел бы знать конкретно, возможно ли достичь этого без изменения модели.В конкретном случае, над которым я работаю, данные отношения являются общими.И противоположной стороной родовых отношений может быть что угодно, поэтому, согласно документам, я не могу действительно ввести GenericRelation несколько раз в разных моделях.

Ответы [ 2 ]

4 голосов
/ 13 апреля 2011

Полагаю, этого можно достичь, используя метод extra QuerySet.

(я его не проверял)

X.objects.extra(where=["x.n in (select y.n from y where y.m = '%s')"], params=['m_value'])
1 голос
/ 13 апреля 2011

Вы можете сделать это, используя raw sql:

def my_custom_sql(m):
    from django.db import connection, transaction
    cursor = connection.cursor()

    # Data retrieval operation - no commit required

    command = """SELECT * 
      FROM tX 
INNER JOIN tY
        ON (tX.n=tY.n AND tY.m=%s)"""

    cursor.execute(command % str(m))
    rows = cursor.fetchall()

    return rows

, используя ORM, я думаю, вы можете сделать это, используя values_list и фильтр in:

class X(models.Model):
    n = models.IntegerField()

class Y(models.Model):
    n = models.IntegerField()
    m = models.IntegerField()

xs = X.objects.filter(n__in=Y.objects.filter(m=m).values_list('n')).distinct()

edit: Как отмечено в комментариях, этот метод сильно ударит по БД

...