LINUX.ORG.RU

Замена ключей в выборке

 ,


0

1

Есть Выборка. Его следующая выборка:

queryset = Person.objects.filter(id=1)
<QuerySet [{'id': 1, 'some_param_id': 1, 'some_param_2': False,}]>

Есть таблица

class SomeTable(models.Model):
    name = models.PositiveSmallIntegerField(
        validators=[MinValueValidator(15), MaxValueValidator(250)],
        verbose_name="some",
        unique=True
    )

в Person поле

some_param_id = models.IntegerField(validators=[MinValueValidator(1)], blank=True)

т.е не ForeignKey, prefetch_related не получится сделать

Мне нужно в первой выборке заменить значение 1 ключа some_param_id на SomeTable__name. Как это сделать?

★★★★

Последнее исправление: bryak (всего исправлений: 5)

Были костыли вроде https://github.com/martsberger/django-joinfield но я не в курсе, работает ли оно в последней джанге.

Можно делать запрос руками в sql.

Если совсем упороться, то можно динамически сделать класс модели, в котором это поле таки ForeignKey и использовать его. Это не потребует миграции, но я опять же не проверял эту грязную магию в последней джанге.

Ну и сравнительно чистый способ всё это сделать — CREATE VIEW с любыми интересными тебе полями и readonly unmanaged модель под этот view (может, уже появились некостыльные способы сделать это managed)…

x3al ★★★★★
()

думал это сделать через annotate

q_person_profile = Person.objects\
    .filter(person_id=param_person_id)\ 
    .annotate(some_new_field=Subquery(Some.objects.filter(id=2)\
    .values('name'.values()

Но дело в том, что annotate не может заменить существующие поля в выборке

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 2)

А че так коряво? Наверное, решаешь не ту проблему, откуда это возникло?

cdshines ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.