Набор запросов Django с isnull =True в get_object_ или_404

#python #django

#python #django

Вопрос:

У меня есть 2 записи в таблице posts, одна из строк в таблице имеет рейтинг NULL, а другая имеет рейтинг 2, оба имеют одинаковый идентификатор пользователя, скажем, 5

Я сначала реализую это

views.py

 class Rating(TemplateView):
    template_name = 'base/rating.html'
    def get(self,request,slug,*args,**kwargs):
        user_id = request.user.id
        post = get_object_or_404(Post.objects.filter(user_id=user_id,rating__isnull=True))
        return render(request,self.template_name)
  

urls.py

 url(r'^post/addRating/(?P<slug>. ?)/$',views.Rating.as_view(),name="post_rating"),
  

Таким образом, фактическая концепция заключается в том, чтобы не отображать представление, если столбец рейтинга
не равен нулю

Таким образом, первая запись с рейтингом null должна возвращать страницу 404, но это не так, а вторая запись отображается правильно

Может ли кто-нибудь помочь мне это исправить?

Комментарии:

1. Если то, что вы описываете, верно, то ни один из них не будет показывать страницу 404; один получит одно сообщение, другой — другое. Так что, вероятно, ваши данные не такие, как вы думаете, или user_id содержат неправильное значение.

2. @RemcoGerlich итак, давайте проигнорируем второе условие и сосредоточимся на первом, все равно оба отображаются. идентификатор пользователя также тот же

3. get_object_or_404 не может вернуть оба, он возвращает только один или вызывает 404. И вы не показываете нам, как вы отображаете вещи.

4. @RemcoGerlich может быть, я ошибаюсь, я пытаюсь получить правильные вещи, размещая то, что я пробую. Можете ли вы это исправить?

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

Ответ №1:

Вам нужно более внимательно прочитать документ django, приведенный выше код неверен. Чтобы использовать get_object_or_404, вы должны написать что-то вроде (из django doc)

 from django.shortcuts import get_object_or_404
def my_view(request):
    my_object = get_object_or_404(MyModel, pk=1)
  

Для вашего продвижения вы должны написать что-то вроде:

 posts = Post.objects.filter(user_id=user_id,rating__isnull=True)
post = posts and posts[0]
  

Комментарии:

1. Это неправильно, в документе, на который вы ссылаетесь, указано, что первый аргумент get_object_or_404 также может быть набором запросов, что он и делает. А другие аргументы могут быть пустыми, почему бы и нет?