我创建了这样的django模型,其中设置表的api_key是OneToOneField to Key表。
class Key(models.Model):
api_key=models.CharField(max_length=100,unique=True)
api_key_name=models.CharField(max_length=100)
def __str__(self):
return self.api_key
class Setting(models.Model):
api_key=models.OneToOneField(Key,on_delete=models.CASCADE)
field_en=models.BooleanField(default=False)
def __str__(self):
return str(self.api_key)
我像这样添加数据到表Key。
api_key="abc1"
api_key_name="test"
在views.py中,我使用key进行如下代码的查询。
def keyForm(request):
key="abc1"
data, created = Setting.objects.get_or_create(api_key__api_key=key)
key = Key.objects.get(api_key=key)
data = {'setting':data, 'key':key}
return render(request,'key_form.html', data)
表中的数据键它显示了这样的误差。如何解决这个问题?
MySQLdb._exceptions.OperationalError: (1048, "Column 'api_key_id' cannot be null")
IntegrityError at /keyForm
(1048, "Column 'api_key_id' cannot be null")
将data, created = Setting.objects.get_or_create(api_key__api_key=key)
改为data, created = Setting.objects.get_or_create(api_key_id=key)
。应该工作。
但是如果你也验证key会更好:
from django.shortcuts import get_object_or_404
def key_form(request):
key="abc1"
key_instance = get_object_or_404(Key, api_key=key)
data, created = Setting.objects.get_or_create(api_key=key_instance)
key = Key.objects.get(api_key=key)
data = {'setting':data, 'key':key}
return render(request,'key_form.html', data)
- 您正在链接设置到DeviceKey,而不是Key
class Setting(models.Model):
api_key=models.OneToOneField(DeviceKey,on_delete=models.CASCADE)
field_en=models.BooleanField(default=False)
def __str__(self):
return str(self.api_key)
- 你得到的错误在key_form视图,因为当你创建一个Settings对象时,你提供了一个键值作为参数,而在Django中它不是这样工作的。您需要提供有效的密钥实例作为参数。
Zorking提供的代码解释了如何做到这一点。