Python Can';t在Django 1.9中禁用ForeignKey引用完整性检查
我有一个包含两个实体的模型,Python Can';t在Django 1.9中禁用ForeignKey引用完整性检查,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我有一个包含两个实体的模型,Person和code人员被代码引用两次,人员可以是代码的用户,也可以是审批人 我希望实现以下目标: 如果用户提供了现有的Person.cusman,则无需进一步操作 如果用户提供了一个未知的Person.cusman,则助手代码将查找Person的其他属性(从外部数据库),并创建一个新的Person实体 我已经实现了一个由pre_save信号触发的功能,它会动态创建缺少的人员。只要我使用python manage.py shell创建一个不存在Person的co
Person
和code
<代码>人员被代码
引用两次,人员
可以是代码的用户
,也可以是审批人
我希望实现以下目标:
- 如果用户提供了现有的
,则无需进一步操作Person.cusman
- 如果用户提供了一个未知的
,则助手代码将查找Person.cusman
的其他属性(从外部数据库),并创建一个新的Person
实体Person
pre_save
信号触发的功能,它会动态创建缺少的人员。只要我使用python manage.py shell
创建一个不存在Person
的code
,它就可以正常工作
但是,当我尝试使用管理表单或CreateView
子体添加新的code
时,我总是在HTML表单上遇到以下验证错误:
Select a valid choice. That choice is not one of the available choices.
显然,在单击Save按钮和code.Save()
方法之间会发生验证,但我无法确定是哪个方法。在pre\u save
创建引用的实体之前,您能帮助我覆盖哪种方法来接受无效的外键吗
models.py
signals.py
views.py
您误解了一件事:您不应该使用TextField
来填充外键,因为django外键是使用下拉/单选按钮来填充的,以引用另一个模型中对象的id
。您得到的错误意味着您提供了与另一型号中的任何id
不匹配的错误信息(Person
)
您可以做的是:不使用ModelForm
,而是使用Form
。调用form.is valid()
之后,您可能还有一些额外的工作要做,但至少您可以按照自己的意愿编写逻辑。实际上,我可以使用CharField
扩展ModelForm
,然后重写save()
方法来实现建议的登录。谢谢
class Person(models.Model):
cusman = models.CharField(
max_length=10,
primary_key=True)
name = models.CharField(max_length=30)
email = models.EmailField()
def __unicode__(self):
return u'{0} ({1})'.format(self.name, self.cusman)
class Code(models.Model):
user = models.ForeignKey(
Person,
on_delete=models.PROTECT,
db_constraint=False)
approver = models.ForeignKey(
Person,
on_delete=models.PROTECT,
related_name='approves',
db_constraint=False)
@receiver(pre_save, sender=Code)
def create_referenced_person(sender, instance, **kwargs):
def create_person_if_doesnt_exist(cusman):
try:
Person = Person.objects.get(pk=cusman)
except Person.DoesNotExist:
Person = Person()
cr = CusmanResolver()
Person_details = cr.get_person_details(cusman)
Person.cusman = Person_details['cusman']
Person.name = Person_details['name']
Person.email = Person_details['email']
Person.save()
create_Person_if_doesnt_exist(instance.user_id)
create_Person_if_doesnt_exist(instance.approver_id)
class CodeAddForm(ModelForm):
class Meta:
model = Code
fields = [
'user',
'approver',
]
widgets = {
'user': TextInput,
'approver': TextInput
}
class CodeAddView(generic.CreateView):
template_name = 'teladm/code_add.html'
form_class = CodeAddForm