tengke 发表于 2023-4-16 19:55:29

TypeError: __init__() got multiple values for keyword argument 'to_fields'

from django.db import models

class Userinfo(models.Model):
    name=models.CharField(verbose_name="姓名",max_length=32)
    password=models.CharField(max_length=64)
    age=models.CharField(max_length=12)
    daa=models.CharField(max_length=12)
    gen=models.CharField(max_length=12)
    defs= models.ForeignKey(to="Uerv",to_fields="name",on_delete=models.CASCADE)
    def __str__(self):
      return self.defs


class Uer(models.Model):
    name=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
    age=models.IntegerField()




报错信息是:
TypeError: __init__() got multiple values for keyword argument 'to_fields'



哪位大佬帮忙看看

isdkz 发表于 2023-4-16 19:55:30

您在Userinfo模型的defs字段中使用了to_fields参数,但是在Django的ForeignKey字段中,应该使用to_field参数。此外,to_field应该设置为关联模型的唯一字段,例如“id”或者其他具有唯一性的字段。以下是修正后的代码:

from django.db import models

class Userinfo(models.Model):
    name=models.CharField(verbose_name="姓名",max_length=32)
    password=models.CharField(max_length=64)
    age=models.CharField(max_length=12)
    daa=models.CharField(max_length=12)
    gen=models.CharField(max_length=12)
    defs= models.ForeignKey(to="Uer", to_field="id", on_delete=models.CASCADE)
    def __str__(self):
      return self.defs


class Uer(models.Model):
    name=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
    age=models.IntegerField()


这里,我将to="Uerv"更改为to="Uer",并将to_fields="name"更改为to_field="id"。您可以根据需要使用其他具有唯一性的字段。现在,这段代码应该可以正常运行。

tengke 发表于 2023-4-16 21:10:48

isdkz 发表于 2023-4-16 19:57
您在Userinfo模型的defs字段中使用了to_fields参数,但是在Django的ForeignKey字段中,应该使用to_field参 ...

to_field和to_fields有什么区别吗

isdkz 发表于 2023-4-16 21:17:43

tengke 发表于 2023-4-16 21:10
to_field和to_fields有什么区别吗

在Django中,to_field 和 to_fields 之间存在一定的差别。它们都用于定义关联模型的字段,但在不同的场景下使用。

1、to_field:它是ForeignKey的一个参数,用于指定关联模型的哪个字段。通常,这个字段应该具有唯一性(如主键或具有unique=True属性的字段)。当创建一个ForeignKey关联时,Django将使用to_field来指明将要关联的模型字段。
例如:

class Author(models.Model):
    name = models.CharField(max_length=100, unique=True)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, to_field='name', on_delete=models.CASCADE)

在这个例子中,Book模型的author字段通过ForeignKey关联到Author模型,我们指定to_field='name',意味着Book的author字段将使用Author模型中具有唯一性的name字段作为关联。

2、to_fields:它是OneToOneField的一个参数,从Django 3.2开始引入。它允许您指定多个字段来定义一个联合唯一约束,也就是说,您可以在关联模型上指定多个字段作为关联依据。
例如:

class Address(models.Model):
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=100)
    zip_code = models.CharField(max_length=10)

    class Meta:
      unique_together = [['street', 'city', 'zip_code']]

class Person(models.Model):
    name = models.CharField(max_length=100)
    address = models.OneToOneField(Address, to_fields=('street', 'city', 'zip_code'), on_delete=models.CASCADE)

在这个例子中,Person模型的address字段通过OneToOneField关联到Address模型,我们指定to_fields=('street', 'city', 'zip_code'),意味着Person的address字段将使用Address模型中的三个字段(street、city和zip_code)组成的联合唯一约束作为关联依据。

总结一下,to_field用于ForeignKey关联,用于指定关联模型的唯一字段,而to_fields用于OneToOneField关联,用于指定关联模型的多个字段作为联合唯一约束。
页: [1]
查看完整版本: TypeError: __init__() got multiple values for keyword argument 'to_fields'