Получение значений из queryset в Django
Столкнулся с проблемой получения значений из моделей с внешними ключами. У меня есть одна модель, в которую включены все отношения по внешнему ключу.
class UserAccount(models.Model):
name= models.CharField(max_length=100)
surname = models.CharField(max_length=100)
category= models.ManyToManyField(Category)
account = models.ForeignKey(Account)
country = models.ForeignKey(Country)
permissions = models.ForeignKey(Permissions)
class Country(models.Model):
iso_code = models.CharField(max_length=6)
zip_code = models.CharField(max_length=10)
Я использую это для получения всех полей, связанных с моделью UserAccount:
user_account_data = UserAccount.objects.all()
name = user_account_data.values_list('name', flat=True)))
surname = user_account_data.values_list('surname', flat=True)))
Но при попытке сделать это, он выдает мне: Объект 'QuerySet' не имеет атрибута 'country'
countries = user_account_data.country.values('iso_code')
попробуйте это
countries = user_account_data.values('country__iso_code')
https://docs.djangoproject.com/en/4.0/ref/models/querysets/#django.db.models.query.QuerySet.values
Please do not make use of .values(…) [Django-doc] or .values_list(…) [Django-doc]: first of all you will here make one query for each value so if you evaluate name, surname, and countries, then you make three queries. Furthermore it is not even said that these queries will produce results in the same order, so matching the items will be a second problem, and finally this will produce dictionaries/lists of values: these thus "erode" the model layer, and introduce a primitive obsession antipattern [refactoring.guru].
Обычно человек работает с объектами модели, поэтому вы можете получить все данные для UserAccount с соответствующими данными Country с помощью:
for item in UserAccount.objects.select_related('country'):
print(item.name)
print(item.surname)
print(item.country.iso_code)
Вы можете использовать их в шаблоне, в сериализаторе, форме и т.д. Это гарантирует, что .name, .surname и .country.iso_code относятся к одному и тому же элементу. item.country является объектом Country: поэтому его можно передавать функциям, которые работают с объектом Country (например, serialize, update и т.д.). Таким образом, удобнее работать с объектами модели, чем со словарями/списками/..., которые содержат данные этих объектов.