Отношение ко многим «по доверенности» в Джанго - PullRequest
0 голосов
/ 08 сентября 2011

Моя модель данных состоит из трех основных объектов:

class User(models.Model):
    ...

class Source(models.Model):
    user = models.ForeignKey(User, related_name='iuser')
    country = models.ForeignKey(Country, on_delete=models.DO_NOTHING)
    description = models.CharField(max_length=100)

class Destination(models.Model):
    user = models.ForeignKey(User, related_name='wuser')
    country = models.ForeignKey(Country)

Я пытаюсь создать набор запросов, который объединяет все источники с пунктами назначения пользователем (многие ко многим).Таким образом, у меня была бы таблица со всеми возможными комбинациями источника / назначения для каждого пользователя.В SQL я просто присоединяюсь к трем таблицам и выбираю соответствующую информацию из каждой таблицы.

Мой вопрос: как выполнить запрос?Как получить доступ к данным запроса?

1 Ответ

0 голосов
/ 08 сентября 2011

В Django запросы выполняются на объекте модели, его хорошо задокументировано .Запросы или наборы запросов являются ленивыми, и когда они выполняются, они обычно возвращают список dict, каждый dict в списке содержит field, за которым следует value, например: [{'user':'albert','country':'US and A :) ','description':'my description'},....].

Все возможные источники,комбинации назначения для каждого пользователя?

Я думаю, вам придется использовать корабль обратной связи , чтобы сделать это, например:

my_joined_query = User.objects.values('user','source__country','source__description','destination__country')

обратите внимание, что я используюМеньшее имя регистра моделей Source и Destination, которые имеют отношение ForeignKey с User, это объединит все три таблицы и ознакомится с документацией.

Редактировать:

Чтобы выполнить внутреннее объединение, вам нужно будет указать запрос, это можно просто сделать, используя __isnull=False в обратном названии модели:

my_innerjoined_query = User.objects.filter(source__isnull=False,destination__isnull=False)

Это должно сделать внутреннее объединение для всех таблиц.

Затем вы можете выбрать то, что вы хотите отобразить, используя values как ранее.

надеюсь, чтопомогает.:)

...