Как сделать "ЕСЛИ ВЫБРАТЬ" с Django orm - PullRequest
0 голосов
/ 15 февраля 2011

Я не могу найти способ сделать mysql «ЕСЛИ ВЫБИРАЕТСЯ» с помощью django orm:

У меня есть эта модель:

class Friendship(models.Model):
    to_user = models.ForeignKey(User, related_name="friends")
    from_user = models.ForeignKey(User, related_name="_unused_")
    added = models.DateField(default=datetime.date.today)

    objects = FriendshipManager()

    class Meta:
        unique_together = (('to_user', 'from_user'),)

Теперь, чтобы получить всех друзей пользователяX я использую это:

  q = Friendship.objects.raw('SELECT IF( from_user_id = X, `to_user_id` ,
 `from_user_id`) AS friend,id FROM `friends_friendship` WHERE `to_user_id` = X
 OR `from_user_id` = X' 

Но необработанные sqls не возвращают никаких объектов, только идентификаторы.Так что это мне совсем не помогает.

Как я могу использовать django ORM для возврата набора запросов пользователей?

С уважением,

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Я предлагаю вам взглянуть на отношение «многие ко многим», поддерживаемое ORM Джанго.

Похоже, ваш случай соответствует примеру из документации Django здесь .

0 голосов
/ 15 февраля 2011

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

qs = Friendship.objects.filter(Q(to_user=X) | Q(from_user=X)).select_related(depth=1)
qs[0].to_user # doesn't cause another query to be made

Если вы добавите новый метод в класс Friendship, вы сможете получить правильный объект User. Значения как to_user, так и from_user уже будут в памяти, поэтому при вызове этой функции запросы не выполняются.

def friend_of(self, user):
    if self.to_user == user:
        return self.from_user
    else:
        return self.to_user
0 голосов
/ 15 февраля 2011

Объекты QuerySet имеют дополнительный метод , который позволяет добавлять необработанный SQL к сгенерированному запросу.Что-то вроде следующего должно работать для вас.

qs = Friendship.objects.filter(Q(to_user=X) | Q(from_user=X))
qs = qs.extra(select={ "friend_id": "IF(from_user_id = X, `to_user_id`, `from_user_id`" })

При таком использовании у объектов Дружбы будет дополнительный параметр, друг, который содержит идентификатор друга.Возможно, вы захотите добавить в Friendship свойство, которое возвращает объект User, но в вашем вопросе недостаточно информации, чтобы наверняка сказать, что это хорошая идея.

@property
def friend(self):
    return User.object.get(id=self.friend_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...