Экземпляр Django возвращает none из ImageField

Как я могу решить эту проблему? Я хочу создать модель с изображением и загрузить его в папку с id этого объекта.

Когда я пытаюсь загрузить изображение в том же классе, я не могу сослаться на id, чтобы добавить в url. Путь выглядит как: http://127.0.0.1:8000/media/foto_pacientes/None/image.png

pacientes.models.py

    class Pacientes(models.Model):
        id = models.AutoField(primary_key=True)
        foto = models.ImageField(blank=True, null=True, upload_to=foto_paciente)

    def foto_paciente(instance,filename):
        print(instance)
        return '/'.join(['foto_pacientes', str(instance.id.id), filename])

Однако, когда я пытаюсь загрузить изображение, используя ForeginKey, я могу получить нужный идентификатор. Как: http://127.0.0.1:8000/media/foto_pacientes/1/image.png

imagens.model.py

def imagens_historico(instance, filename):
    print(instance)
    return '/'.join(['historico', str(instance.id_historico.id_historico), filename])


class ImagensHistorico(models.Model):
    id_imagem_historico = models.AutoField(primary_key=True)
    imagem = models.ImageField(blank=True, null=True, upload_to=imagens_historico)
    id_historico = models.ForeignKey(Historicos, related_name='imagens',
                                     on_delete=models.CASCADE, blank=False, null=False)

Ну, вы не можете ссылаться на id объекта, который еще не создан. Что вы можете сделать, так это использовать первичный ключ объекта для создания папки для хранения изображения .

Удалите поле id_imagem_historico = models.AutoField(primary_key=True). Если требуется, оставьте его .

Эту проблему можно легко решить с помощью этого метода . Поместите его в ваш models.py

Код :

def get_new_image_file_path(self , filename):
    return "imagens_historico/{}/image_name.png".format(self.pk)

class ImagensHistorico(models.Model):
    imagem = models.ImageField(blank=True, null=True, upload_to=get_new_image_file_path)
    id_historico = models.ForeignKey(Historicos, related_name='imagens',
                                     on_delete=models.CASCADE, blank=False, null=False)

Это решит вашу проблему, и то, чего вы хотите, будет легко достигнуто.

Вернуться на верх