Django: Как получить доступ к отношениям m2m и использовать их для создания пути к файлу. Или: как сначала сохранить отношения модели, а затем остальные - PullRequest
0 голосов
/ 28 апреля 2019

Итак, предположим, у меня есть следующая (упрощенная) модель Django:

class Document(models.Model):
    def get_file_path(self, filename):
        extension = filename.split('.')[-1]
        product_string = ', '.join(p.__str__() for p in self.related_products.all())
        return 'documents/{}/{}.{}'.format(product_string, self.document_id, extension)

    document_id = models.CharField(max_length=9)
    related_products = models.ManyToManyField(to=Product, related_name='documents')
    file = models.FileField(upload_to=get_file_path)

Как вы видите, я хочу, чтобы мой путь к файлу основывался на содержании отношения m2m (related_products).Однако это не работает и выдает следующую ошибку:

должно иметь значение для поля "id", прежде чем можно будет использовать это отношение "многие ко многим".

Что, конечно, имеет смысл.Но я не знаю, как это решить.Мне либо нужен доступ к информации отношения m2m до того, как будет сохранено.Или мне нужно сначала сохранить модель и ее взаимосвязи, не сохраняя файл, а только потом сохранять файл специально.

Кроме того, если это имеет значение;это должно работать только в Django Admin.

Любая помощь будет оценена.Спасибо!:)

1 Ответ

0 голосов
/ 29 апреля 2019

Чтобы позволить вам сохранить отношения на странице администратора, вам нужно сделать поле file необязательным;это делается путем добавления blank=True к модели.

file = models.FileField(upload_to=get_file_path, blank=True)

blank, а не null, как я изначально предлагал, работает.См. Этот вопрос SO для объяснения: Django - как сделать необязательным ImageField / FileField?

Теперь вы можете создать отношение Document-Product, а затем добавить файл, который будет помещен впапка «документы», как определено вашим методом get_file_path.

Хотя изменение поля позволяет обойти проблему создания пути загрузки файла, оно нарушает требование наличия в документе документа.Если вы можете с этим смириться, хорошо, но если нет, вам нужно будет найти другое решение, которое по-прежнему соответствует требованию file.

После рассмотрения этой проблемы, я думаю, вам нужно изменить дизайн относительнохранение документов.Размещение файлов в папках на основе их первоначальной связи с продуктом является слишком ограничительным.Что произойдет, если впоследствии документ будет связан с другим продуктом, собираетесь ли вы обновить имя папки?Та же проблема возникает при удалении Продукта.

Поскольку вы храните ваши отношения в базе данных, нет необходимости также указывать эту информацию в имени папки.Упростите наименование вашей папки и позвольте базе данных отслеживать ссылки.После этого вы сможете применить требования к файлам для документов и , используя интерфейс администратора для создания отношений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...