应用场景
一条线有且只有一个参考站,在一次性保存的时候验证参考站的唯一性。
踩过的坑
- 试图重写save_model和save_relate在存储过程中拦截并添加报错,结果徒劳无功
正确的写法
- 自定义个formset类并重写里面的clean方法,如果不合逻辑直接抛异常,官方出处
class StationFormSet(BaseInlineFormSet):
def clean(self):
super().clean()
exist = False
for form in self.forms:
is_bottleneck = form.cleaned_data.get('is_bottleneck')
if is_bottleneck and exist:
raise forms.ValidationError('there is only one')
elif is_bottleneck:
exist = True
然后就是在inline admin类里面注入formset,官方出处
class StationInLine(admin.StackedInline):
model = Station
fields = (('name', 'db_id'), ('serial_number', 'is_bottleneck'))
formset = StationFormSet
最后就是添加到model admin 了,官方出处
@admin.register(Line)
class LineAdmin(admin.ModelAdmin):
fields = (('name', 'serial_number'),)
inlines = [StationInLine, ]
成功!
总结
其实django的官方文档很全,功能也很强大,但是你不能按照spring或者.net的思路去找,必须按照django自己的思路找文档,找关键点