在Django管理员中,是否可以根据组将模型分成子模型?

时间:2010-09-07 18:21:30

标签: django django-models django-admin

我认为这是最容易理解的一个例子:

我有模型ImageImageType,其中和图像只有一种类型。 ImageType中的参数可以调整图片大小,缩略图大小等,因为照片库图片的显示方式可能与个人资料图片不同。

我希望个人资料图片和图库图片在Django管理网站中显示为单独的模型。一种选择是做这样的事情:

class ProfileImage (Image):
    pass

class GalleryImage (Image):
    pass

class ProfileImageAdmin (ImageAdmin):
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type='profile')

class GalleryImageAdmin (ImageAdmin):
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type='gallery')

admin.site.register(ProfileImage, ProfileImageAdmin)
admin.site.register(GalleryImage, GalleryImageAdmin)

但除了拥有冗余代码之外,这完全违背了让数据库首先组织这些代码的目的。另一个选择是丢失我的ImageImageType模型,并为每种类型创建单独的几乎相同的表(即ProfileImageGalleryImage),但更糟糕的是,因为这将要求用户有权访问配置文件,这在我看来几乎无法实现CMS的目的。

我有什么方法可以做这样的事情吗?

admin.site.register(Image, ImageAdmin, group_by='type')

或者,如果这是不可能的,有没有人对我可以解决的其他方法有任何建议? (例如,python中是否有一种方法可以基于数据库动态创建类?)

干杯! 马特

1 个答案:

答案 0 :(得分:4)

有一种方法。这涉及对一种(或两种)图像使用proxy模型。然后,您可以为这两者添加单独的管理员。对于例如

# models.py
class ProfileImage (Image):
    class Meta:
        proxy = True

class GalleryImage (Image):
    class Meta:
        proxy = True

这将避免创建新表。您仍将存储与Image模型对应的表中的所有数据。然后,您可以为这些代理注册两个不同的管理员。

# admin.py
class ProfileImageAdmin (ImageAdmin):
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type='profile')

class GalleryImageAdmin (ImageAdmin):
    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type='gallery')

admin.site.register(ProfileImage, ProfileImageAdmin)
admin.site.register(GalleryImage, GalleryImageAdmin)