【问题标题】:Why Django requires "_id" in the name of ForeignKey field?为什么 Django 在 ForeignKey 字段的名称中需要“_id”?
【发布时间】:2019-07-31 02:46:20
【问题描述】:

我有球员、球队和比赛的模型。显然,我有一些 ForeignKey 字段。但是如果我不在 ForeignKey 字段末尾添加“_id”,Django 会引发错误:“no such column: betbot_testmatch.leftTeam_id”

我尝试在我的 ForeignKey 字段末尾添加“_id”,它确实解决了问题,但是在我之前设计的项目中,我一直在使用 FK 字段,字段名称末尾没有任何“_id”没有任何问题。

models.py

from django.db import models


class TestMatch(models.Model):
    leftTeam = models.ForeignKey('TestTeam', on_delete=models.DO_NOTHING, related_name='+', default='Left Team')
    rightTeam = models.ForeignKey('TestTeam', on_delete=models.DO_NOTHING, related_name='+', default='Right Team')

class TestTeam(models.Model):
    name = models.CharField(max_length=30, default='Team')
    urlslug = models.SlugField(max_length=5)



class TestPlayer(models.Model):
    name = models.CharField(max_length=100, default='Player')
    nick = models.CharField(max_length=20, default='Nickname')
    team_id = models.ForeignKey('TestTeam', on_delete=models.DO_NOTHING, default='Team')
    #photo = models.ImageField(upload_to='', null=True)
    No = 'N'
    Yes = 'Y'
    STANDIN_CHOICES = [
        (Yes, 'Yes'),
        (No, 'No'),
    ]
    standin = models.CharField(max_length=5, choices=STANDIN_CHOICES, default=No)
    slug = models.SlugField(max_length=20, default=nick)

我希望我可以将我的名字用于 ForeignKey 字段而不会出错。

【问题讨论】:

  • 嘿@KochetovMXM 您确定在更改模型结构后您已经正确运行了一次迁移吗?

标签: python django database


【解决方案1】:

当模型上有一个ForeignKey 字段时,Django 会在后台做一些事情

class Foo(models.Model):
    bar = models.ForeignKey(Bar, on_delete=models.CACSCADE)

Foo 的每个实例现在都有两个属性

foo = Foo()

# This is a descriptor that will perform a DB lookup for the
# related model and return it or raise an exception
foo.bar

# This will return the actual value stored in the database
# that is used by the descriptor to lookup the related model
# by default this will be the id
foor.bar_id

【讨论】:

  • 我明白了,但是问题是如果我不在字段名后面加上“_id”,那么django就会报错“no such column: betbot_testmatch.leftTeam_id”跨度>
  • 正如比卡什所说。您是否进行过迁移?
  • 我确实做到了,我检查了我的上一个项目,django 没有在那里要求“_id”
  • 如果我有更改,它们将适用
【解决方案2】:

问题解决了。问题是在 TestMatch 中没有任何字段,而是 ForeignKey,所以 Django 无法为其创建 id。

【讨论】:

猜你喜欢
  • 2012-10-18
  • 1970-01-01
  • 2012-11-24
  • 2012-11-04
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
相关资源
最近更新 更多