Django:检查表单的关系类型
我遇到了一种情况,我需要在保存表单之前检查一下它是否有多对多的关系,因为我在不同的模型中使用了同一个views.py。
举个例子:
#models.py
class BaseClass(models.Model):
# Some generic stuff.
class SomeClass(BaseClass):
# This class doesnt have any many2many relations
class SomeOtherClass(BaseClass):
# This class has many2many relations
#views.py
def do_some_stuff(request):
# Instantiate a form
# Save it in a normal way
form.save()
# Now, in here while saving I need to check if the form has any
# m2m relations so I can use the save_m2m() function after form.save()
我只需要在这里多加一个检查,以确保安全。有没有什么办法可以解决这个问题?谢谢!
4 个回答
0
if hasattr(form, 'save_m2m'):
form.save_m2m()
你需要记住的是,save_m2m
这个东西只有在你用 commit=False
参数调用 form.save
的时候才需要用到(而且它也只有在这种情况下才存在)。如果你用默认的 commit=True
来保存,那就不需要 save_m2m
了。
0
Antony说得对,其实更简单。我引用一下文档中的内容:
使用
commit=False
的另一个副作用是,当你的模型与另一个模型有多对多关系时会出现。如果你的模型有多对多关系,而你在保存表单时指定了commit=False
,Django就无法立即保存多对多关系的数据。这是因为在实例还没有存在于数据库中时,无法保存多对多的数据。为了解决这个问题,每次你使用
commit=False
保存表单时,Django会在你的ModelForm子类中添加一个save_m2m()
方法。
根据这个,如果你不使用commit=False
来保存表单,那么save_m2m()
这个方法根本不存在,无论是否有多对多关系。
遵循Python的格言“请求宽恕比请求许可更容易”,你也可以这样做:
try:
form.save_m2m()
except:
pass
如果你真的想这么做的话。
0
我刚刚找到了这个问题的可能解决办法。
你可以试试这样的做法:
if len(form_instance._meta.many_to_many) > 0:
for i in form_instance._meta.many_to_many:
if type(i) = ManyToManyField:
form_instance.save_m2m()
break