在创建带有表单的基础对象的对象时,我正在尝试验证相关对象(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
部分苦苦挣扎,因为父级可能不存在,因此不是有效的选择。我可以先创建父节点,然后再创建下一个节点,但是当它失败时,由于子节点失败,它将创建一堆孤立节点。
我想验证每个节点并一起创建(或不创建)。