添加的外键未保存在django中

时间:2015-06-25 07:50:47

标签: django

我有一个用户可以上传文件的表单。上传后,每个文件立即保存到db,并将每个文件的id存储在表单上的隐藏字段中。提交表单时,视图将提取ID并尝试创建每个文件与表单对象(服务器场)之间的关系。虽然id​​到达了视图,但是关系没有保存,我不明白为什么 - 请帮忙。

class File(models.Model):
    name = models.CharField(max_length=200, null=True, blank=True)
    event = models.ForeignKey('Event', related_name='files', null=True, blank=True, on_delete=models.SET_NULL)
    farm = models.ForeignKey('Farm', related_name='files', null=True, blank=True, on_delete=models.SET_NULL)

class Farm(models.Model):
    name = models.CharField(max_length=200, null=True, blank=True)

class FarmCreateView(CreateView):
    template_name = 'directory/farm_registration.html'
    model = Farm

    def post(self, request, *args, **kwargs):
        farm_form = FarmForm(self.request.POST)

        if farm_form.is_valid():
            new_farm = farm_form.save(commit=False)

            image_upload_ids = self.request.POST.get('_file_ids_photos')
            # confirmed using print that the image ids are added here
            if image_upload_ids:
                image_upload_ids = image_upload_ids.split(',')
                for image in filter(None, image_upload_ids):
                    image_file = File.objects.get(id=image)
                    #confirmed using print that the image_file object is retrieved from the db
                    new_farm.files.add(image_file)

            print('Files count', new_farm.files.count())
            # above line prints 0, even though files are added in the loop above
            new_farm.save()

1 个答案:

答案 0 :(得分:1)

new_farm尚未保存,因此它没有主键。其他项目与它有关,直到它有一个 - 它们会在FK字段中放入什么?

你根本不需要commit=False。只需在is_valid块的开头保存它;没有必要在最后再次保存它,因为您还没有更改Farm对象,您只更改了文件。

(我想知道这里的FK关系是否正确。这是一对多的,所以你得到现有的文件,并将他们所指向的任何农场更改为新的。这真的是你的意思吗?想做什么?我怀疑多对多的关系会更好,所以文件可以指向多个农场。)