Как я могу получить имя пользователя через набор запросов?

У меня есть некоторая модель:

class Comments(models.Model):
user = models.ForeignKey(User, related_name='user_comment', on_delete=models.CASCADE)

heading = models.CharField(max_length=100)
score = models.IntegerField(default = 1, validators=[MinValueValidator(1), MaxValueValidator(5)])
text = models.CharField(max_length=1000)
created_at = models.DateTimeField(auto_now_add=True)

class Meta:
    ordering = ['-created_at',]

def __str__(self):
    return self.heading

И когда я делаю .get запрос в shell:

Comments.objects.get(pk=1).user    

Я получаю:

<User: user9>

Но когда я делаю этот запрос:

 Comments.objects.filter(pk=1).values('user') 

Я получаю:

<QuerySet [{'user': 9}]>

По какой-то причине в наборе запросов я получаю только id, но не имя пользователя. Из-за особенностей моего приложения мне нужно использовать именно .filter или .all (), поэтому я должен как-то получить имя пользователя в queryset. Пожалуйста, помогите мне.

Вы можете использовать индекс для получения объекта.

print(Comments.objects.filter(pk=1)[0].username)

Вы получаете id, потому что Django записывает отношение как ID объекта, который связан с другим объектом. Например, в таблице Comment в вашей базе данных, столбец user хранит ID строки таблицы User.

Чтобы получить имя пользователя, вы можете просто сделать следующее Comments.objects.filter(pk=1).values('user__username')

Если вы хотите получить все имена пользователей из QuerySet:

usernames = Comments.objects.filter(pk=1).values_list('username', flat=True)

Если вы хотите получить первое имя пользователя из QuerySet:

comment_qs = Comments.objects.filter(pk=1).values_list('username', flat=True)
username = comment_qs.first() if comment_qs.exists() else 'Unknown'

или

try:
    comment = Comments.objects.get(pk=1)
except Comments.DoesNotExist:
    username = 'Unknown'
else:
    username = comment.username
Вернуться на верх