Foregin键字段的值错误

时间:2018-08-17 17:22:55

标签: django django-models

我正在尝试插入数据,但是由于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.

1 个答案:

答案 0 :(得分:1)

该错误包含您的问题的答案:test_namesForeignKey,而不是字符串。要通过名称进行设置,首先需要在Test表中找到密钥。可以使用getget_or_create完成此操作,具体取决于您要如何处理丢失的测试。

注意:test_names对于该ForeignKey字段不是一个很好的名字,可能引起这种混乱。它不应该是复数,并且指向Test对象,而不仅仅是一个名称。您可能想要更像test

您的代码中还有一些其他的困惑。首先,您似乎在内部迭代中交换了值(jtest_name获取其值,然后应用于ResultValue,而k来自{{1} },但转到test_list)。您可以通过使用更明确的变量名来避免这种混乱。造成混淆的第二个原因是变量名test_namesapp_codetest_name,它们似乎都是列表,但是只有其中一个具有似乎可以反映这一点的名称。

将这些要点合并为代码,请尝试以下类似方法。请注意,我更改了一些变量名称以反映我认为您的意图,并且我使用了一个简单的test_list,而您可能还需要其他内容。调整以适合您的需求:

get_or_create