【问题标题】:Django error with ForeignKey referenceForeignKey 参考的 Django 错误
【发布时间】:2012-06-24 21:03:13
【问题描述】:

我有一个关于 django 的 ForeignKey 引用问题的问题。

这是我的代码的一部分:

应用门票交易者

class TicketsTrader(models.Model):
    seller = models.ForeignKey(User, related_name='ticketsTrader_seller')
    buyer = models.ForeignKey(User, related_name='ticketsTrader_buyer')
    inscription = models.ForeignKey(Inscription)
    transactionCode = models.CharField(max_length=30,blank=False,null=False)
    ...

应用题字

class Event(models.Model):
    title = models.CharField(max_length=75)
    description = models.TextField()
    ...

class Inscription(models.Model):
    event = models.ForeignKey(Event)
    packs = models.ManyToManyField(PackChoise)
    user = models.ForeignKey(User)
    ...

    def __unicode__(self):
        return self.event.__unicode__() + u': ' + self.user.__unicode__()

    def inscriptionKey(self):
        return str(self.pk) + '_' + str(self.valkey)

但是当我尝试访问 Grapelli 管理员中的“添加票务交易商”界面时,我收到一条错误消息:

用户匹配查询不存在。

Python27\lib\site-packages\django\db\models\query.py 在 get,第 366 行

在模板 \grappelli\templates\admin\includes\fieldset.html 中,错误 在第 19 行

我想要得到的是:在我的ticketTrader表的“inscription”列中获取我的“Inscription”表的唯一ID(pk)的值。

或“inscriptionKey”的值,但我认为不可能。

Django 版本:1.4 / Python 版本:2.7.3 / South 最后一个版本

感谢您的帮助:)

【问题讨论】:

  • 你有buyer = models.Field(...)。这应该是ForeignKey(...)。我猜这不在您的实际 model.py 代码中?
  • 哦,抱歉,这是将我的代码复制过去的错误,因为我正在尝试一些事情。我纠正它谢谢:)。但这不是造成问题的部分。但是没有这个错误,是的,这是我的实际 model.py。
  • 啊,请修复您的__unicode__ 方法。永远不要直接调用另一个对象的魔法函数——改用内置的unicode() 函数。无论如何,你的方法应该只是return u'%s: %s' % (self.event, self.user)
  • 谢谢丹尼尔的提示:)我会检查的。

标签: python django foreign-keys admin


【解决方案1】:

我只能猜测:

TicketsTrader 有一个 Inscription 的外键,它有一个 User 的外键,并在其 __unicode__() 方法中使用该键。

现在,我不知道 Grapelli,但默认管理应用程序会在 Add TicketsTrader 页面上呈现 Inscription-s 的下拉菜单。如果某些Inscription-s 指向不存在的User-s,那么它们的__unicode__() 方法将失败并显示您指定的错误消息。

问题是怎么可能缺少一些User-s 而Inscription-s 却没有指向它们。好吧,如果你使用例如MySQL+MyISAM,在那里没有强制执行外键,所以可能会发生各种奇怪的事情。

【讨论】:

  • 我们使用的是 MySQL+MyISAM。我检查了我们数据库的完整性,其中一个铭文没有用户,我们正在迁移到一个新网站,这是因为迁移脚本在此用户上失败,因为他有一个不允许的奇怪/特殊 char 用户名新的那一个。非常感谢或您的帮助。我搜索得太远了:D
  • @yann:你可以考虑使用 InnoDB。如果您需要全文搜索,请使用 InnoDB + (Sphinx|Xapian|...) 或切换到 PostgreSQL(无论如何,这是一个比 MySQL 更完整的数据库)。
  • 我不是选择数据库类型的人,但我会与他核实。感谢您的帮助。
【解决方案2】:

我认为是因为您没有任何用户...在创建 Ticket Trader 之前尝试创建用户

【讨论】:

  • 有用户,但如前文所述,有一个没有用户的铭文,这会造成数据库损坏。不过谢谢。
猜你喜欢
  • 2020-09-12
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 2011-09-22
  • 2021-10-27
  • 2013-08-15
  • 2013-02-11
相关资源
最近更新 更多