django如何将get_or_create与FileField和upload_to一起使用

时间:2018-04-06 19:13:01

标签: django

我有一个用户上传数据文件的网站。为了防止用户上传重复的数据文件,我正在使用Django的get_or_create,它工作正常,直到我向模型添加了'upload_to'。

这是我的模特:

class TestFile(models.Model):
    file = models.FileField(upload_to='data/%Y/%m/')
    date = models.DateField(default=date.today)
    welded-part = models.ForeignKey(WeldedPart, null=True, blank=True, on_delete=models.CASCADE)

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

上传文件会调用以下函数:

def process_data_file(myfile, my_id):
    a, created = TestFile.objects.get_or_create(file=myfile)
    if created:
        do some number crunching here
        a.welded-part = my_id
        a.save()
    return created

如果我尝试上传testfile.xyz,它会检查TestFile.object ='testfile.xyz'的对象。

我永远不会找到重复的文件,因为该对象将文件存储为'data / 2018/04 / testfile.xyz',而不是'testfile.xyz'。

在这个实例中使用get_or_create的正确方法是什么?

我正在使用django 1.11.3

1 个答案:

答案 0 :(得分:0)

所以我想我解决了这个问题。我在我的模型中添加了一个文件名CharField。并且一条更好的路径不依赖于日期,而是路径取决于文件名的重要部分。

def testfilepath(instance, filename):
return 'testdata/%s/%s/%s' % (str(filename)[:4] , str(filename)[4:6] , str(filename))


class TestFile(models.Model):
    file = models.FileField(upload_to=testfilepath)
    filename = models.CharField(max_length=50, null=True) 
    date = models.DateField(default=date.today)
    welded-part = models.ForeignKey(WeldedPart, null=True, blank=True, on_delete=models.CASCADE)

所以现在我可以检查文件名的get_or_create,它不包含路径

def process_data_file(myfile, my_id):
    a, created = TestFile.objects.get_or_create(filename=str(myfile))
    if created:
        do some number crunching here
        a.file = myfile 
        a.welded-part = my_id
        a.save()
    return created