为了账号安全,请及时绑定邮箱和手机立即绑定

Python Django 使用错误的查询

Python Django 使用错误的查询

猛跑小猪 2023-07-11 15:28:46
我有一个问题,为了解决它,我尝试进入 shell,但我找不到解决方案,所以我希望你能帮助我。我正在导入包含 id 和图像 URL 的模型图像,但由于此错误我无法获取它。代码:from recipes_database.models import Images Images.objects.all()这里是错误:Traceback (most recent call last):   File "F:\Developement\Projects\WhatToCookWeb\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute    return self.cursor.execute(sql, params)   File "F:\Developement\Projects\WhatToCookWeb\venv\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute    return Database.Cursor.execute(self, query, params) sqlite3.OperationalError: no such column: Images.idThe above exception was the direct cause of the following exception:Traceback (most recent call last):   File "<console>", line 1, in <module>   File "F:\Developement\Projects\WhatToCookWeb\venv\lib\site-packages\django\db\models\query.py", line 263, in __repr__    data = list(self[:REPR_OUTPUT_SIZE + 1])   File "F:\Developement\Projects\WhatToCookWeb\venv\lib\site-packages\django\db\models\query.py", line 269, in __len__    self._fetch_all()   File "F:\Developement\Projects\WhatToCookWeb\venv\lib\site-packages\django\db\models\query.py", line 1303, in _fetch_all但是当我对其他模型做同样的事情时,它起作用了,我想知道这次有什么不同。这是我的图像模型:class Images(models.Model):    # Field name made lowercase.    rezept_id = models.ForeignKey(        'Rezepte', models.DO_NOTHING, db_column='Rezept_ID', blank=True, null=True)    # Field name made lowercase.    image_url = models.CharField(        db_column='Image_URL', blank=True, null=True, max_length=1000)    class Meta:        managed = False        db_table = 'Images'我认为 Django 以某种方式使用了错误的查询,因为没有 Images.id,只有 Images.recipe_id。希望你能帮助我谢谢!
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

如果您自己没有指定主键, Django会自动添加主键。事实上,正如文档所说:

默认情况下,Django 为每个模型提供以下字段:

id = models.AutoField(primary_key=True)

这是一个自动递增的主键。

如果您想指定自定义主键,请在您的字段之一上指定 。primary_key=True如果 Django 发现您已显式设置Field.primary_key,它不会添加自动 id 列。

在你的模型中,你没有设置主键,所以Django会自动添加一个额外的字段id,这也将在查询中使用。

例如,如果image_url是主键,您可以将其指定为:

# image_url is the primary key


class Images(models.Model):

    # Field name made lowercase.

    rezept = models.ForeignKey(

        'Rezepte',

        models.DO_NOTHING,

        db_column='Rezept_ID',

        blank=True,

        null=True

    )

    # Field name made lowercase.

    image_url = models.CharField(

        db_column='Image_URL',

        blank=True,

        null=True,

        max_length=1000,

        primary_key=True

    )


    class Meta:

        managed = False

        db_table = 'Images'

如果 therezept是主键,那么它也意味着它是唯一的,在这种情况下,将其设为OneToOneField[Django-doc]更有意义,因为它具有ForeignKey唯一性约束,而且它还有一些含义的逆向关系:


# rezept is the primary key


class Images(models.Model):

    # Field name made lowercase.

    rezept = models.OneToOneField(

        'Rezepte',

        db_column='Rezept_ID',

        primary_key=True

    )

    # Field name made lowercase.

    image_url = models.CharField(

        db_column='Image_URL',

        blank=True,

        null=True,

        max_length=1000

    )


    class Meta:

        managed = False

        db_table = 'Images'

注意:通常不会_id向ForeignKey字段添加后缀,因为 Django 会自动添加一个带有_id后缀的“孪生”字段。因此应该是rezept,而不是rezept_id。


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信