当我将实例添加到 M2M 关系时,我想更改行为,可能会覆盖,以便我可以执行以下操作:
try:
my_instance.one_field_set.add( another_instance )
except ValidationError:
# do something
那可能吗?
当我将实例添加到 M2M 关系时,我想更改行为,可能会覆盖,以便我可以执行以下操作:
try:
my_instance.one_field_set.add( another_instance )
except ValidationError:
# do something
那可能吗?
是的,但不要那样做。
1) 使用可以为您的 M2M 关系使用显式intermediate
模型,并为其提供自定义方法manager
,您可以在其中替换create
方法。
2) 不过,在我看来,最好的方法是在其中一个模型上使用一个实例方法add_something
,该方法提供必要的验证和异常处理逻辑。
我发现了一个类似的问题,这不是我想要的,但可以作为一种解决方法。
@receiver(m2m_changed, sender=MyModel.my_field.through)
def check(sender, **kwargs):
if kwargs['action'] == 'pre_add':
add = AnotherModel.objects.filter(pk__in=kwargs["pk_set"]) # instances being added
# your validation here...
感谢mamachanko提出的问题。