web-dev-qa-db-ja.com

Django Admin:OneToOne Relation as a Inline?

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',)
59
Jiaaro

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)
73
Daniel Roseman

最後の質問を参照すると、複数のサブタイプに最適なソリューションは何でしょうか。たとえば、サブタイプクラスBookとサブタイプクラスCDを含むクラス製品。ここに示す方法では、製品を編集し、一般的なアイテムに加えて、書籍のサブタイプアイテムとCDのサブタイプアイテムを編集する必要があります。したがって、本を追加するだけの場合でも、CDのフィールドも取得できます。サブタイプを追加する場合、例えばDVDでは、3つのサブタイプフィールドグループを取得できますが、実際には、前述の例では1つのサブタイプグループのみが必要です。

6
Henri

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)

このバリアントでは、製品はインラインになります。

6
Alexey

OneToOneFieldで 'parent_link = True'を設定することもできますか?

https://docs.djangoproject.com/en/dev/topics/db/models/#specifying-the-parent-link-field

1
stephendwolff