Django переименовать столбец при объединении нескольких таблиц - PullRequest
1 голос
/ 08 апреля 2020

У меня есть этот класс в 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 код для переименования словарных ключей, но это не очень хороший вариант. что мне делать? Есть ли простое решение для этого?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Во-первых, вы можете пропустить .all(), если используете .values() Во-вторых, вот решение:

result = Customer.objects.values("code", "phone").annotate(
    username=F('user__username'), 
    email=F('user__email')
)
0 голосов
/ 08 апреля 2020

возможно, вы можете использовать дополнительные функции

address = Customer.objects.extra(select={'code': 'code', 'user__username': 'username', 'user__email': 'email'})
...