У меня есть этот класс в models.py:
class Customer(models.Model):
code = models.CharField(unique=True, max_length=10)
user = models.OneToOneField(User, on_delete=models.PROTECT)
phone = models.CharField(max_length=20)
address = models.TextField(blank=True)
balance = models.PositiveIntegerField(default=20000)
Клиент имеет отношение один к одному с классом User. Класс User является классом User по умолчанию в Django:
from django.contrib.auth.models import User
Я хочу вернуть результат следующим образом:
"customers": [
{
"code": a1,
"username": "arashb91",
"email": "arash@example.com",
"phone": "111111",
"address": "somewhere",
"balance": 20000
},
но когда я использую этот код:
result = Customer.objects.all().values("code", 'user__username', 'user__email', "phone", "address", "balance")
мой результат будет таким:
"customers":
{
"code": a1,
"user__username": "arashb91",
"user__email": "arash@example.com",
"phone": "111111",
"address": "somewhere",
"balance": 20000
},
Я могу переименовать поля по методу F:
result = Customer.objects.all().values("code", username=F('user__username'),
email=F('user__email'), "phone", "address", "balance")
Но я получаю эту ошибку на "phone", "address", "balance":
Positional argument after keyword argument
"Код" в порядке, потому что он до F методов. Порядок в результатах важен для меня.
Я также не могу использовать этот код (F для других полей):
result = Customer.objects.all().values("code", username=F('user__username'),
email=F('user__email'), phone=F("phone"))
, потому что я получаю эту ошибку:
The annotation 'phone' conflicts with a field on the model.
Я не хочу, чтобы мой результат был таким: othertable__field
для решения моей проблемы Я использовал python код для переименования словарных ключей, но это не очень хороший вариант. что мне делать? Есть ли простое решение для этого?