Джанго многотоманы и через пару - PullRequest
0 голосов
/ 22 мая 2011

У меня есть модели django с подключением manytomany с классом through:

class userProfile(models.Model):
    boughtCoupons = models.ManyToManyField(Coupon, through='UserCoupons')

class UserCoupons(models.Model):
    user = models.ForeignKey(userProfile)
    coupon = models.ForeignKey(Coupon)
    date = models.DateField()


class Coupon(models.Model):
    name = models.CharField(max_length=10)

Я знаю, как получить каждую из них по отдельности, используя и ID, или что-то для фильтрации.

Но мне нужно получить значение таблицы Сквозной со всеми данными пользователя (профилем).

Итак, как я могу сделать что-то вроде JOIN и получить пару UserCoupons + userProfile в одном запросе?(Таким образом, я могу получить соответствующий профиль пользователя без дополнительного запроса?)

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Если вы используете версию Django 1.2 или ниже, то, насколько мне известно, ответ jkbrzt является единственным решением, поскольку единственный способ заставить Django генерировать JOIN без использования исходного SQL - это использовать select_related() или Djangoзнак подчеркивания double_ - ни один из которых не работает на отношениях «многие ко многим» в Django 1.2 или менее.Однако двойная нотация _underscore в Django работает со многими ко многим в Django 1.3, поэтому вы можете делать следующее:

userProfile.objects.values('boughtCoupons__name', 'usercoupons__date')

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

1 голос
/ 22 мая 2011

Вы можете запросить напрямую по UserCoupons и использовать select_related() для извлечения связанных объектов в одном запросе:

UserCoupons.objects.select_related().filter(**your_filters)

Обратите внимание, что select_related() не работает«назад».Вот почему вам нужно использовать менеджер класса, который определяет ForeignKey, чтобы он работал (UserCoupons в этом случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...