Django, ссылаясь на объекты с двойным подчеркиванием - PullRequest
1 голос
/ 05 мая 2020

У меня есть функция в файле просмотра проекта Django Rest Framework. Где он отфильтровывает комментарии (модель), относящуюся к определенному c Сообщение

 class CommentListCreate(APIView):
    def get(self, request,pk):
        comment = Comment.objects.filter(post_id=pk)
        serializer = CommentSerializers(comment, many=True)
        return Response(serializer.data)   

Вышеупомянутая функция может фильтровать в соответствии с post_id , но если я изменю аргументы фильтра, как указано ниже

 def get(self, request,pk):
        comment = Comment.objects.filter(post__id=pk)

Функция работает нормально, почему мы используем двойное подчеркивание для ссылки на идентификатор сообщения?

Git Ссылка на мои представления .py https://github.com/Anoop-George/DjangoBlog/blob/master/blog/views.py

Ответы [ 2 ]

1 голос
/ 05 мая 2020

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

Предположим, у меня есть следующие модели:

class Car(models.Model):
    ...

    engine = models.ForeignKey('Engine', ...)

class Engine(models.Model):
    ...
    engine_size = models.IntegerField()
    engine_make = models.ForeignKey('EngineMake', ...)

class EngineMake(models.Model):
    company_name = models.CharField()

Теперь, если бы я хотел Чтобы найти все автомобили с двигателем, произведенным определенной компанией, до go в соответствующих полях я могу использовать двойное подчеркивание, например:

cars = Car.objects.filter(engine__engine_make__company_name="something")

В вашем случае вы не На самом деле нужно двойное подчеркивание, так как, когда вы добавляете ForeignKey, Django автоматически добавляет поле с именем foo_id, например, если вы добавляете внешний ключ с именем foo.

1 голос
/ 05 мая 2020

Если это ForeignKey, вы можете использовать и . Первое post_id - это «двойное поле» Django, заменяющее ForeignKey (имя с суффиксом _id) и хранящее значение первичного ключа записи. он относится к (или другому полю уникальному , если вы укажете это в параметре to_field).

Если вы хотите просмотреть отношение, используйте двойные подчеркивания (__). Таким образом, вы также можете ссылаться на него с помощью post__id.

Однако, если вы хотите выполнить фильтрацию на основе title объекта Post, вы запрашиваете с помощью:

comment = Comment.objects.filter(<b>post__title='some title'</b>)

Вы не можете использовать одиночные символы подчеркивания, поскольку ForeignKey создает только двойное поле для хранения ссылки, оно не создает поле post_title для хранения заголовка упомянутого объекта Post (это не было бы хорошая идея, поскольку она вводит дублирование данных ).

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