我正在尝试插入数据,但是由于ForeignKey而在插入时出现ValueError。
class Test(models.Model):
test_name = models.CharField(max_length=20, unique=True)
test_code = models.SlugField(max_length=10, name='Code',unique=True)
referance_value = models.CharField(name='Referance', max_length=20)
def __str__(self):
return self.test_name
class TestTaken(models.Model):
app_code = models.CharField(max_length=20,unique=True)
user_name = models.CharField(name='Username',max_length=20)
test_names = models.ForeignKey(Test, on_delete=models.CASCADE)
result_value = models.CharField(name='ResultValue',max_length=20)
def __str__(self):
return self.app_code
下面是我的View.py
def alltestdata(request):
if request.method == 'POST':
app_code = request.POST.getlist('app_code')
test_name = request.POST.getlist('name')
test_list = request.POST.getlist('test_list')
for i, j , k in zip(app_code, test_name, test_list):
book = TestTaken(app_code=i, ResultValue=j, test_names=k, Username=request.user.username)
book.save()
return redirect('lab:Dashboard')
我遇到以下错误
ValueError: Cannot assign "'eeeee'": "TestTaken.test_names" must be a "Test" instance.
答案 0 :(得分:1)
该错误包含您的问题的答案:test_names
是ForeignKey
,而不是字符串。要通过名称进行设置,首先需要在Test
表中找到密钥。可以使用get
或get_or_create
完成此操作,具体取决于您要如何处理丢失的测试。
注意:test_names
对于该ForeignKey
字段不是一个很好的名字,可能引起这种混乱。它不应该是复数,并且指向Test
对象,而不仅仅是一个名称。您可能想要更像test
您的代码中还有一些其他的困惑。首先,您似乎在内部迭代中交换了值(j
从test_name
获取其值,然后应用于ResultValue
,而k
来自{{1} },但转到test_list
)。您可以通过使用更明确的变量名来避免这种混乱。造成混淆的第二个原因是变量名test_names
,app_code
和test_name
,它们似乎都是列表,但是只有其中一个具有似乎可以反映这一点的名称。
将这些要点合并为代码,请尝试以下类似方法。请注意,我更改了一些变量名称以反映我认为您的意图,并且我使用了一个简单的test_list
,而您可能还需要其他内容。调整以适合您的需求:
get_or_create