我怎么知道实例的属性是否为Django信号中的ImageField?

问题描述 投票:1回答:2

这是我的模型(简体):

class Book(models.Model):
        title = models.CharField(max_length=200)
        ...
        img_1 = models.ImageField(null=True)
        img_2 = models.ImageField(null=True)
        img_3 = models.ImageField(null=True)

我有一个post_save信号:

@receiver(post_save, sender=Book)
def meli_publicar_signal(sender, instance, **kwargs):
    if kwargs.get('created', True):
       # get images

我在这里想要获取所有图像字段(img_1,img_2等),并检查它们是否为空。

django signals
2个回答
1
投票

我建议您使用Many-to-one relationships将图像链接到Book对象。它会比实际的更具动态性。

这里是一个示例:

class Book(models.Model):
    title = models.CharField(max_length=200)
    # other fields

    def __str__(self):
        return self.title

class BookImage(models.Model):
    image = models.ImageField(upload_to="images/")
    book = models.ForeignKey(Book, related_name="images")

    def __str__(self):
        return self.image.url

现在,您不必在保存图像之前检查图像是否为空,因为您无法将BookImage添加到Book,因为imagebook属性没有设置null参数到True

然后,获取Book对象的网址:

@receiver(post_save, sender=Book)
def meli_publicar_signal(sender, instance, **kwargs):
    for image in instance.images.all():
        print(image.image.url)
        # output : /media/images/filename.png

**注意:如果更新字段,created设置为False,则它将不处理if kwargs.get('created', True):下的代码。

如果要保留基本模型不包含BookImage对象,则可以执行此操作:

@receiver(post_save, sender=Tel)
def meli_publicar_signal(sender, instance, **kwargs):
   for attr, value in instance.__dict__.items():
       if isinstance(value, ImageFieldFile) and value:
           print(value.url)
           # output : /media/images/filename.png

阅读ImageField文档以获取更多信息


0
投票

获取所有为图像的字段并检查它们是否为空的创建方法:

from django.db import models

def get_image_fields_values(obj):
    try:
        image_fields = [getattr(obj, f.name, None)
                        for f in obj._meta.get_fields()
                        if isinstance(f, models.ImageField)]
        # => [<ImageFieldFile: None>, <ImageFieldFile: movie/g-men.jpg>]
        image_values = [image.name for image in image_fields if image.name]
        # => ['movie/g-men.jpg']
    except AttributeError:
        return []
    return image_values

然后在post_save信号中调用该方法,如:

@receiver(post_save, sender=Book)
def meli_publicar_signal(sender, instance, **kwargs):
    if kwargs.get('created', True):
        images = get_image_fields_values(obj=instance)
© www.soinside.com 2019 - 2024. All rights reserved.