我正在尝试从ManyToMany字段的slug设置ImageField的upload_to
值。
这是我的模特:
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'实例需要在a之前具有主键值 可以使用多对多关系。
有没有正确的方法呢?
感谢您的帮助!
答案 0 :(得分:2)
在访问instance
之前,您必须先保存Image()
,这是albums
的实例,而M2M关系为instance.albums.all()
。
在Model
中使用pk
之前,请Django admin file upload with current model id查看保存点upload_to()
。由于M2M妨碍了此处,而不是帖子中提到的post_save()
方法,请使用m2m_changed
信号通知instance.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)
这取决于Image.albums
的m2m值,如果没有,image
将丢失。因此,我建议使用一些比此更坚固的其他密钥。
在保存image
本身和M2M关系后,您也可以直接使用modelform手动保存Image()
字段。