Как получить доступ к переводу, определенному в базовой модели, из представлений и панели администратора дочерней модели
В проекте, который достался мне в наследство, есть несколько полиморфных моделей, основанных на общей модели. Что-то вроде:
from django.db import models
from polymorphic.models import PolymorphicManager, PolymorphicModel
class Product(PolymorphicModel):
name=models.CharField(max_length=127)
objects=PolymorphicManager
class Book(Product):
pass
class Drink(Product):
pass
<
Тем не менее, я модифицировал модели следующим образом:
from django.db import models
from parler.models import TranslatableModel, TranslatedFields
from parler.managers import TranslatableManager, TranslatableQuerySet
from polymorphic.models import PolymorphicManager, PolymorphicModel
from polymorphic.query import PolymorphicQuerySet
class ProductQuerySet(PolymorphicQuerySet, TranslatableQuerySet):
pass
class ProductManager(PolymorphicManager, TranslatableManager):
queryset_class = MarkerQuerySet
class Product(PolymorphicModel):
translations = TranslatedFields(
name=models.CharField(max_length=127)
objects=ProductManager
class Book(Product):
pass
class Drink(Product):
pass
А в оболочке django все работает нормально:
In [1]: from product.models import Book
In [2]: b0 = Book.objects.first()
In [3]: b0
Out[3]: <Book: A Brief History of Time>
In [4]: b1 = Book()
In [5]: b1.name = 'Hitchhikers Guide to the Galaxy'
In [6]: b1.save()
In [7]: b2 = Book(name='Slaughterhouse V')
In [8]: b2.save()
Однако, когда я запускаю тесты конечных точек, я получаю несколько загадочную ошибку:
.venv/lib/python3.12/site-packages/django/db/models/sql/query.py:1577: in _add_q
child_clause, needed_inner = self.build_filter
.
.
.
> arg, value = filter_expr
E ValueError: too many values to unpack (expected 2)
И другая ошибка, когда я пытаюсь увидеть панель администратора для дочерних моделей:
Cannot resolve keyword 'name' into field.
Я попробовал добавить вычисляемые свойства к дочерним моделям, чтобы посмотреть, может ли это исправить админ-панель, но это не помогло. Есть ли у кого-нибудь опыт создания чего-то подобного?
Мне следовало внимательнее читать документацию. Все заработало, как только я добавил PolymorphicParentModelAdmin
и PolymorphicChildModelAdmin
в качестве базовых классов в соответствующие панели администратора, а также указал поля, которые они делают доступными:
ProductAdmin(
TranslatableAdmin,
PolymorphicParentModelAdmin,
):
base_model = Product
child_models = (Book, Drink)
BookAdmin(
TranslatableAdmin,
PolymorphicChildModelAdmin,
):
base_model = Product
base_model = Marker
base_fields = ("name")
DrinkAdmin(
TranslatableAdmin,
PolymorphicChildModelAdmin,
):
base_model = Product
base_model = Marker
base_fields = ("name")