动态添加字段到模型(或在一个单独的类中存储一些字段)

时间:2016-04-13 12:49:51

标签: python django django-models django-imagekit

我想使用ImageSpecField django-imagekit来调整图片大小,所以我不想为模型中的每个ImageSpecField创建一个新的ImageField字段,我想创建一个包含原始图像和图像缩略图的新类或modelField,并在我的模型中为图像实例化这个新的modelField。

例如,如果我的模型有profile_picture字段,我想同时拥有profile_pictureprofile_picture_thumbnail。如果我的模型有avatar字段,我想同时拥有avataravatar_thumbnail

那么有没有办法为模型动态生成这些字段?

这样做的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

据我所知,向django模型动态注入字段并非易事。如果您想尝试,这可以作为您的起点。

类似的帖子可以在这里找到。 http://www.sixpearls.com/blog/2013/feb/django-class_prepared-signal/

from django.db.models.signals import class_prepared
def add_image_fields(sender, **kwargs):
    """
    class_prepared signal handler that checks for the model massmedia.Image
    and adds sized image fields
    """
    if sender.__name__ == "Image" and sender._meta.app_label == 'massmedia':
        large = models.ImageField(upload_to=".", blank=True, verbose_name=_('large image file'))
        medium = models.ImageField(upload_to=".", blank=True, verbose_name=_('medium image file'))
        small = models.ImageField(upload_to=".", blank=True, verbose_name=_('small image file'))

        large.contribute_to_class(sender, "large")
        medium.contribute_to_class(sender, "medium")
        small.contribute_to_class(sender, "small")

class_prepared.connect(add_image_fields)

基本上附加了一个函数来创建那些字段。

您可以捕获class_prepared信号并列出所有字段(如果是图像字段),然后提供给类image_field_thumbnail

要使所有字段都属于某个模型,您可以使用get_fields