我有一个用户上传数据文件的网站。为了防止用户上传重复的数据文件,我正在使用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
答案 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