Django:检查表单的关系类型

1 投票
4 回答
699 浏览
提问于 2025-04-15 18:14

我遇到了一种情况,我需要在保存表单之前检查一下它是否有多对多的关系,因为我在不同的模型中使用了同一个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

撰写回答