Как я могу получить имя пользователя через набор запросов?
У меня есть некоторая модель:
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