program story

Django 관리자 : 인라인으로서의 OneToOne 관계?

inputbox 2020. 12. 5. 09:43
반응형

Django 관리자 : 인라인으로서의 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'>

이 작업을 수행하는 유일한 방법은 사용자 지정 양식 입니까?

편집 : 필드를 직접 추가하기 위해 다음 코드를 시도했습니다 ...도 작동하지 않습니다.

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와 같은 하위 유형을 추가하면 세 개의 하위 유형 필드 그룹이 생기지 만 실제로는 하나의 하위 유형 그룹 만 필요합니다.


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

참고URL : https://stackoverflow.com/questions/1744203/django-admin-onetoone-relation-as-an-inline

반응형