select_related возвращает значение None при запросе - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь получить поле name моей модели Category, но оно возвращает None.Я могу подтвердить, что есть значение, запустив print(post.categories.values()).который возвращает

QuerySet [{'id': 3, 'name': 'Tasks'}]>

Модель:

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=30)

class Post(models.Model):
    title = models.SlugField(max_length = 250, null = True, blank = True)
    body = models.TextField()
    created_on = models.DateTimeField(null=True)
    last_modified = models.DateTimeField(null=True)
    categories = models.ManyToManyField('Category', related_name='posts')

class Comment(models.Model):
    author = models.CharField(max_length=60)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    post = models.ForeignKey('Post', on_delete=models.CASCADE)

Вид:

def blog_index(request):
    posts = Post.objects.all().order_by('-created_on')
    context = {
        "posts": posts,
    }
    return render(request, "blog_index.html", context)


def blog_category(request, category):
    posts = Post.objects.filter(
        categories__name__contains=category
    ).order_by(
        '-created_on'
    )
    if not posts:
        return HttpResponse(status=404)

    context = {
        "category": category,
        "posts": posts
    }
    return render(request, "blog_category.html", context)

def blog_detail(request, pk):
    post = Post.objects.select_related().get(pk=pk)
    print(post.categories.name) # Returns None!!
    form = CommentForm()
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = Comment(
                author=form.cleaned_data["author"],
                body=form.cleaned_data["body"],
                post=post
            )
            comment.save()

    comments = Comment.objects.filter(post=post)
    context = {
        "post": post,
        "comments": comments,
        "form": form,
    }
    return render(request, "blog_detail.html", context)

1 Ответ

0 голосов
/ 27 мая 2019

select_related - это только повышение производительности, которое следует отношениям с внешним ключом. В вашем случае у вас нет models.Foreignkey в объекте Post, поэтому он вообще не выполняет никаких оптимизаций.

У вас есть models.ManyToManyField между публикацией и категорией, это означает, что вы можете иметь более одной категории для публикации. Чтобы получить названия категорий, вам нужно пройтись по списку post.categories

print([category.name for category in post.categories.all()])

Также, если вам интересно, есть оптимизация для этого типа отношений с prefetch_related

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