无法分配“'4'”:"Element.value_code" 必须是 "Value" 实例

Cannot assign "'4'": "Element.value_code" must be a "Value" instance

我正在尝试保存 element.value_code,但出现此错误。如果我在 getlist 上得到 value_code,我的任务就结束了。我应该如何纠正这个错误?如果你能告诉我,我将不胜感激。

错误:

Cannot assign "'4'": "Element.value_code" must be a "Value" instance.

models.py

只有与值和元素相关的模型,但我们添加了所有模型以帮助您理解为什么存在 option_code 和 designated_code。

class Option(models.Model):
    option_code = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['option_code']

class Value(models.Model):
    value_code = models.AutoField(primary_key=True)
    option_code = models.ForeignKey(Option, on_delete=models.CASCADE, db_column='option_code')
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')
    name = models.CharField(max_length=32)
    extra_cost = models.IntegerField()

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['value_code']

class Designated(models.Model):
    designated_code = models.AutoField(primary_key=True)
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')
    price = models.IntegerField()
    rep_price = models.BooleanField(default=True)

    class Meta:
        ordering = ['designated_code']

    def __str__(self):
        return str(self.designated_code)

class Element(models.Model):
    element_code = models.AutoField(primary_key=True)
    designated_code = models.ForeignKey(Designated, on_delete=models.CASCADE, db_column='designated_code')
    value_code = models.ForeignKey(Value, on_delete=models.CASCADE, db_column='value_code', null=True, blank=True)

    class Meta:
        ordering = ['element_code']

    def __str__(self):
        return str(self.element_code)

views.py

if request.method == "POST":
    form = ElementForm(request.POST)

    if form.is_valid():
        for value_code2 in request.POST.getlist('value_code2'):
            element = Element()
            element.designated_code = Designated.objects.get(product_code=id)
            element.value_code = value_code2
            element.save()

    else:
        element = Element()
        element.designated_code = Designated.objects.get(product_code=id)
        element.value_code = None
        element.save()

forms.py

class ElementForm(forms.Form):
    value_code2 = forms.ModelChoiceField(error_messages={'required': "옵션을 선택하세요."}, label="옵션", queryset=Value.objects.all())

您正在向您的url发送PKID

为了在发送的 PK 和你的 Element 模型之间建立关系,你应该给 Element 一个 Value 的对象,而不是它的 PK

当你使用 for value_code2 in request.POST.getlist('value_code2') 时,value_code2PK,这是错误的

你的解决方案可以是在将数据传递给 ElementForm 之后,这 returns 你一些 cleaned_data 如果 form.is_valid()。在那个 cleaned_data 中应该有 Value object:

...
if form.is_valid():
    element = Element()
    element.designated_code = Designated.objects.get(product_code=id)
    element.value_code = form.cleaned_data['value_code2']
    element.save()

阅读 https://docs.djangoproject.com/en/3.2/ref/forms/api/#django.forms.Form.cleaned_data

中的 cleaned_data