Satchmoアプリケーションの管理者をまとめています。 SatchmoはOneToOneリレーションを使用してベースProduct
モデルを拡張します。すべて1ページで編集したいと思います。
インラインとして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',)
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とサブタイプクラスCDを含むクラス製品。ここに示す方法では、製品を編集し、一般的なアイテムに加えて、書籍のサブタイプアイテムとCDのサブタイプアイテムを編集する必要があります。したがって、本を追加するだけの場合でも、CDのフィールドも取得できます。サブタイプを追加する場合、例えばDVDでは、3つのサブタイプフィールドグループを取得できますが、実際には、前述の例では1つのサブタイプグループのみが必要です。
OneToOne関係の代わりに継承を使用する場合があります
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(Product):
.....
または、プロキシクラスを使用する
class ProductProxy(Product)
class Meta:
proxy = True
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)
このバリアントでは、製品はインラインになります。
OneToOneFieldで 'parent_link = True'を設定することもできますか?
https://docs.djangoproject.com/en/dev/topics/db/models/#specifying-the-parent-link-field