Django Admin: отношение OneToOne как встроенное?
Я собираю администратора для приложения satchmo. Satchmo использует отношения OneToOne для расширения базы Product
модель, и я хотел бы отредактировать все это на одной странице.
возможно иметь отношение OneToOne как встроенное? Если нет, каков наилучший способ добавить несколько полей на данную страницу моего администратора, которые в конечном итоге будут сохранены в отношении OneToOne?
например:
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(models.Model):
product = models.OneToOne(Product)
...
Я пробовал это для моего администратора, но это не работает, и кажется, ожидается внешний ключ:
class ProductInline(admin.StackedInline):
model = Product
fields = ('name',)
class MyProductAdmin(admin.ModelAdmin):
inlines = (AlbumProductInline,)
admin.site.register(MyProduct, MyProductAdmin)
который выдает эту ошибку:<class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>
- Это единственный способ сделать это Пользовательские Формы?
edit: просто попробовал следующий код, чтобы добавить поля напрямую... и не работает:
class AlbumAdmin(admin.ModelAdmin):
fields = ('product__name',)
4 ответов
вполне возможно использовать встроенный для отношения OneToOne. Однако фактическое поле, определяющее связь, должно быть на встроенной модели, а не родительской - точно так же, как для ForeignKey. Переключите его, и он будет работать.
редактировать после комментария: вы говорите, что родительская модель уже зарегистрирована у администратора: затем отмените регистрацию и перерегистрацию.
from original.satchmo.admin import ProductAdmin
class MyProductInline(admin.StackedInline):
model = MyProduct
class ExtendedProductAdmin(ProductAdmin):
inlines = ProductAdmin.inlines + (MyProductInline,)
admin.site.unregister(Product)
admin.site.register(Product, ExtendedProductAdmin)
ссылаясь на последний вопрос, что было бы лучшим решением для нескольких подтипов. Продукт класса Е. Г с подтипом класса Book и Sub-тип компакт-класса. Способ, показанный здесь, вам нужно будет отредактировать продукт общие элементы плюс элементы подтипа для книги и элементы подтипа для CD. Поэтому, даже если вы хотите добавить только книгу, вы также получите поля для CD. Если вы добавляете подтип, например DVD, вы получаете три группы полей подтипа, В то время как на самом деле вы хотите только одну группу подтипа, в пример: книги.
возможно, использовать наследование вместо onetoone отношения
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(Product):
.....
или использовать прокси-классы
class ProductProxy(Product)
class Meta:
proxy = True
in admin.py
class MyProductInlines(admin.StackedInline):
model = MyProduct
class MyProductAdmin(admin.ModelAdmin):
inlines = [MyProductInlines]
def queryset(self, request):
qs = super(MyProductAdmin, self).queryset(request)
qs = qs.exclude(relatedNameForYourProduct__isnone=True)
return qs
admin.site.register(ProductProxy, MyProductAdmin)
В этом варианте ваш продукт будет в узде.
вы также можете попробовать установить 'parent_link=True' на вашем OneToOneField?
https://docs.djangoproject.com/en/dev/topics/db/models/#specifying-the-parent-link-field