Джанго М2М с "Я" через Int. таблица, как получить связанные предметы - PullRequest
1 голос
/ 16 августа 2011

Я пытаюсь установить отношение M2M в одной из моих моделей.Django попросил меня указать аргумент related_name для некоторых полей, и я поставил их.Тем не менее, я теперь запутался с тем, как получить связанные предметы.Вот мои упрощенные модели.

class Post(models.Model):
    # other fields
    relevancy = models.ManyToManyField("self",through="Traffic",symmetrical=False,related_name="relevant",blank=True)

    #some method definitions

class Traffic(models.Model):
    tfrom = models.ForeignKey(Post,related_name="tfrom")
    tto = models.ForeignKey(Post,related_name="tto")
    count = models.PositiveIntegerField(default=0)

Это должен быть анализ тенденций пользователей и предоставление предложений другим пользователям.Часть, в которой я запутался, - это та часть, где я получаю связанное сообщение с соответствующим сообщением.Например, когда я выбираю «Опубликовать», как мне получить набор сообщений с трафиком из этого сообщения или набор сообщений, которые перешли на этот пост и т. Д. Вот мой связанный вопрос , который я опубликовал ранее.

PS: английский не является моим основным языком, извините, если мой вопрос трудно понять.

1 Ответ

1 голос
/ 16 августа 2011

Это зависит от определения промежуточной модели. Первый FK промежуточной модели - это то, что определяет «основной» доступ, поэтому

a_post.relevancy.all()

- это набор всех Post экземпляров с трафиком от a_post до них .

a_post.relevant.all()

- это набор всех Post экземпляров с трафиком от них до a_post.

Вы должны действительно подумать о ваших соглашениях об именах, это довольно запутанно. Что-то в линии

links = models.ManyToManyField("self",
             through="Traffic",
             symmetrical=False,
             related_name="referrers",
             blank=True)

Ключ в коде чарджа Джанго:

https://code.djangoproject.com/browser/django/trunk/django/db/models/fields/related.py#L1059

                    # If this is an m2m-intermediate to self,
                    # the first foreign key you find will be
                    # the source column. Keep searching for
                    # the second foreign key.

Итак, у вас есть это

s1 = set(my_post.relevancy.all())
s2 = set(t.tto for t in my_post.tfrom.select_related('tto'))
assert not s1.symmetric_difference(s2)

В более простом SQL дескриптор p.relevancy получает все экземпляры Post, где идентификатор находится в

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