Запросить значение столбца связанного объекта и сохранить его как переменную

Я пытаюсь получить значение моего столбца name в моей модели Category, которая связана с моей Post моделью. Я хочу сохранить значение name в переменной для последующего использования. Я пробовал print(post.categories.name), но он возвращает значение None. Я могу подтвердить фактическое значение, запустив post.categories.values(), который вернет <QuerySet [{'id': 1, 'name': 'General'}]>

Модель:

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_detail(request, pk):
    post = Post.objects.select_related().get(pk=pk)
    category = post.categories.name # This returns None but should return General
    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)

Пост может иметь несколько категорий, какую из них вы хотите?

dirkgroten 27.05.2019 18:13

Если вы хотите все названия категорий, вы можете сделать names = [category.name for category in post.categories.all()]

dirkgroten 27.05.2019 18:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете. Вы определили categories как ManyToManyField в своей модели Post, поэтому post.categories — это ModelManager для получения категорий, а post.categories.all() возвращает все категории, связанный с post.

Вы можете получить список имен для категорий поста следующим образом:

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

Данг. Могу ли я изменить это в своей модели, чтобы пост мог иметь только одну категорию? Я не планирую добавлять несколько категорий для каждого сообщения. Дело в том, что я хотел бы получить чистое значение из моей базы данных, чтобы сохранить его как переменную. Это возвращает значение в виде объекта списка ['Общие'], который мне не нужен.

Lesnie Sncheider 27.05.2019 19:30

Если сообщение может иметь только одну категорию, вам следует использовать ForeignKey, а не ManyToManyField.

dirkgroten 27.05.2019 19:54

Понятно. Спасибо!

Lesnie Sncheider 27.05.2019 19:57

Другие вопросы по теме