0

我正在尝试upload_to从 ManyToMany 字段的 slug 中设置 ImageField 的值。

这是我的模型:

def get_image_path(instance, filename):
    return os.path.join('gallery', str(instance.albums.all()[0]), filename)

class Image(models.Model):
    ...
    image = models.ImageField(upload_to=get_image_path)
    ...

不幸的是它不起作用。当我尝试保存 Image 对象时,出现错误:

'Image' 实例需要有一个主键值才能使用多对多关系。

有没有正确的做法?

谢谢您的帮助!

4

1 回答 1

2

在访问之前,您必须首先保存和 M2M 关系 w/instance的一个实例。Image()albumsinstance.albums.all()

使用. _ Model_ _ 由于 M2M 在这里遇到了麻烦,而不是帖子中提到的方法,使用信号通知准备就绪,例如:pkupload_to()post_save()m2m_changedinstance.albums.all()

@receiver(m2m_changed, sender=Image.albums.through)
def save_file_on_m2m(sender, instance, action, **kwargs):
    if action == 'post_add' and hasattr(instance, _UNSAVED_FILEFIELD):
        instance.image = getattr(instance, _UNSAVED_FILEFIELD)
        instance.save()        
        instance.__dict__.pop(_UNSAVED_FILEFIELD)

这取决于 的 m2m 值Image.albums,如果没有,image将会丢失。因此,我建议使用其他一些比这个更可靠的键。

您也可以在保存自身和 M2M 关系后,直接在模型表单上image手动保存字段。Image()

于 2012-06-26T15:43:37.273 回答