如何与表单一起验证和创建相关对象

时间:2018-06-21 15:16:49

标签: django django-forms django-mptt

在创建带有表单的基础对象的对象时,我正在尝试验证相关对象(ForeignKey)。相关对象可能存在也可能不存在。下面我使用MPTT,但这是一个一般的外键问题。

我有一个这样的模型:

# model:
class MyMPTTModel(models.Model):
    name = models.CharField(max_length=256, unique=True) # this is set
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children') 

#form
class MyMPTTModelForm(forms.ModelForm):

    parent = mptt_forms.TreeNodeChoiceField(queryset=MyMPTTModel.objects.all())

    class Meta:
        model = MyMPTTModel
        fields = ['name', 'parent']

我想以原子形式get_or_create()来创建一组节点(set?)。

类似的东西:

paths = ['each-part/of-the-path/is-the-name', 'each-part/of-the-path/could-have-mutliple-children']
for path in paths:
    parent = None
    nodes = []
    for p in path.split('/'):    
        nodes.append({'name': p, 'parent': parent })
        parent = p

    for node in nodes:
        name, parent = node.values()
        if parent:
            parent = MyMPTTModel.objects.get_or_create(name=parent)[0]
        MyMPTTModel.objects.get_or_create(name=name)

我正在为表单的get_or_create部分苦苦挣扎,因为父级可能不存在,因此不是有效的选择。我可以先创建父节点,然后再创建下一个节点,但是当它失败时,由于子节点失败,它将创建一堆孤立节点。

我想验证每个节点并一起创建(或不创建)。

0 个答案:

没有答案