django: как расширить существующую модель

#django #django-models

#django #django-модели

Вопрос:

существует множество примеров, рассказывающих вам, как расширить пользовательскую модель, НО я не могу найти реальный, полный и документированный пример того, как расширить существующую модель без необходимости следовать «шаблону профиля пользователя» (и, честно говоря, мне интересно, почему).

Короче говоря, мой вариант использования следующий: мне нужно расширить модель продукта django-lfs.

В LFS регистрируется следующим образом (в lfs.catalog.admin):

 from django.contrib import admin

[...]
from lfs.catalog.models import Product
[...]
class ProductAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("name", )}
admin.site.register(Product, ProductAdmin)
[...]
  

Я попытался зарегистрировать свою (которая подклассирует ее), но я получил:

django/contrib/admin/sites.py «, строка 78, в регистре raise AlreadyRegistered(‘Модель %s уже зарегистрирована’ % model.name)

Итак, кто-то предложил мне отменить регистрацию этого объекта и зарегистрировать свой.

Я сделал это следующим образом:

 from lfs.catalog.models import Product
from lfs.catalog.admin import ProductAdmin

admin.site.unregister(Product)

from lfs_product_highlights.catalog.models import Product

admin.site.register(Product,ProductAdmin)
  

На этот раз ошибок нет, НО и изменений нет, мои пользовательские поля нигде не видны.

Есть какие-нибудь подсказки?

Комментарии:

1. Добавляет ли ваш подкласс model новые поля базы данных? Если нет, вы могли бы взглянуть на модели прокси: lincolnloop.com/blog/2010/dec/16 /…

2. да, я делаю это для добавления полей

Ответ №1:

Причина, по которой это сложно, заключается в несоответствии объектно-реляционного импеданса (люблю эту фразу). Объекты и классы не идеально отображаются на реляционные базы данных: ORM, подобные попытке Django сгладить границы, но есть некоторые места, где различия просто слишком велики. Наследование является одним из них: просто нет способа заставить одну таблицу «наследовать» от другой, поэтому ее приходится моделировать с помощью внешних ключей или тому подобного.

В любом случае, что касается вашей реальной проблемы, я действительно не вижу, что происходит, но одним из возможных способов исправить это было бы также создать подкласс ProductAdmin и специально установить model атрибут для вашей подклассовой модели.