Django EmbeddedField由于重命名字段而引发ValidationError

8ftvxx2r  于 2023-01-21  发布在  Go
关注(0)|答案(3)|浏览(177)

bounty将在2天后过期。回答此问题可获得+50声望奖励。StuffHappens希望引起更多人关注此问题。

我有一个Django应用程序,使用djongo作为数据库驱动程序。

class Blog(models.Model):
    _id = models.ObjectIdField()
    name = models.CharField(max_length=100, db_column="Name")
    tagline = models.TextField()

class Entry(models.Model):
    _id = models.ObjectIdField()
    blog = models.EmbeddedField(
        model_container=Blog
    )

当我运行此应用程序时,我得到一个错误:

File "\.venv\lib\site-packages\djongo\models\fields.py", line 125, in _validate_container
    raise ValidationError(
django.core.exceptions.ValidationError: ['Field "m.Blog.name"  of model container:"<class \'project.m.models.Blog\'>" cannot be named as "name", different from column name "Name"']

我想保持模型和数据库中字段name的名称不同,因为数据库已经存在,我不能更改它。数据库使用camelCase命名字段,而在应用程序中,我想使用snake_case。
如何避免这种错误?

wlzqhblo

wlzqhblo1#

您得到的错误是由于Djongo试图验证模型中的字段name和数据库中创建的字段Name。您可以通过在EmbeddedField中设置validate=False来指定Djongo不验证模型容器中的字段。将您的Entry模型修改为:

class Entry(models.Model):
    _id = models.ObjectIdField()
    blog = models.EmbeddedField(
        model_container=Blog, validate=False
    )

这将修复您的错误。

g0czyy6m

g0czyy6m2#

试试这个:

class Blog(models.Model):
    _id = models.ObjectIdField()
    name = models.CharField(max_length=100, db_column="BlogName")
    tagline = models.TextField()

或者这个

class Blog(models.Model):
    _id = models.ObjectIdField()
    BlogName = models.CharField(max_length=100, db_column="name")
    tagline = models.TextField()

使用“db_colum”参数时,必须选择不同的名称,无论是小写还是大写

zfycwa2u

zfycwa2u3#

我认为它应该是db_column而不是bd_column,因此:

class Blog(models.Model):
    _id = models.ObjectIdField()
    name = models.CharField(max_length=100, db_column="Name")
    tagline = models.TextField()

相关问题