如何通过外键访问模型的__str__方法?

时间:2019-07-24 15:18:05

标签: python django foreign-keys

我创建了一个文件模型和一个文件夹模型。文件模型通过外键连接到所有者(用户)和文件夹。 现在,我要在以下路径上上传文件:owner_username/folder_title。我的问题是如何从文件模型内部使用__str__访问Folder模型的ForeignKey方法?

我的猜测是将{_1}}参数upload_to设置为等于FileField,但是结果是我的文件被上传到:str(folder)

在models.py:

<django.db.models.fields.related.ForeignKey>/graph2.jpg

我希望以某种方式将文件上传到具有以下格式的路径:nameOfTheOwner / nameOfTheFolder

1 个答案:

答案 0 :(得分:2)

您可以将upload_to= parameter [Django-doc]设置为可访问self的可调用对象,例如:

class File(models.Model):

    def gen_filename(self, filename):
        return '{}/{}/{}'.format(self.owner.username, self.folder.title, filename)

    owner = models.ForeignKey(
        User,
        related_name='user', 
        on_delete=models.CASCADE
    )
    folder = models.ForeignKey(
        Folder,
        related_name='files', 
        on_delete=models.CASCADE,
        default=''
    )
    file = models.FileField(upload_to=gen_filename)

    def __str__(self):
        return str(self.file)

或者您可以使用文件夹的__str__,例如:

class File(models.Model):

    def gen_filename(self, filename):
        return '{}/{}/'.format(self.owner.username, self.folder, filename)

    owner = models.ForeignKey(
        User,
        related_name='user', 
        on_delete=models.CASCADE
    )
    folder = models.ForeignKey(
        Folder,
        related_name='files', 
        on_delete=models.CASCADE,
        default=''
    )
    file = models.FileField(upload_to=gen_filename)

    def __str__(self):
        return str(self.file)