【问题标题】:Django ForeignKey for Imported Table Data用于导入表数据的 Django ForeignKey
【发布时间】:2014-01-06 15:35:32
【问题描述】:

我有两个表,School 和 Scores,它们有一个共同的 'psid' 列。我正在将每个表中的数据导入我的应用程序。我想通过 ForeignKey 将两个表链接在一起(一所学校可以有多个分数)。

目前我的 models.py 看起来像这样:

class School(models.Model):
    psid = models.CharField(primary_key=True, max_length=5)
    city = models.CharField(max_length=100)

class Score(models.Model):
    psid = models.ForeignKey(School, max_length=5, db_column='psid')
    scores = models.IntegerField(max_length=2)

我是否需要在 Scores 中添加一个额外字段,以便我既可以从原始表中导入 psid 列,又可以有一个 ForeignKey 字段通过“psid”列将 Scores 和 School 链接在一起?

感谢任何帮助。

【问题讨论】:

  • 我有点困惑,您是否希望获取相关的学校对象 psid 值或为每个名为 psid 的与学校 psid 列无关的分数对象拥有另一个独立字段(顺便说一句,班级名称应该不是复数)?
  • 嗨yuvi,是的,分数应该是单数。我编辑了这个问题来解决这个问题。我的目标是能够获取具有 psid 值的学校对象。在我的模板中,我显示了每所学校的分数。
  • 你认为你为什么需要另一个字段?
  • 获取相关模型及其信息是django ORM中一个非常基础的部分,建议大家开通manage.py shell学习how to execute simple queries。我还建议您至少检查一次django tutorial(如果您还没有)
  • @DanielRoseman 我主要担心我在初始设置中犯了错误(根据您的回复,我不是)。在 Score 中使用 db_column 应该是可以通过 psid ForeignKey 来匹配两张表吧?当我在模板中显示学校的分数信息时,psid 匹配已关闭,即。它将显示错误学校的分数。我想这可能与我的观点或模板有关。稍后我会再试一次与此相关的更具体的问题。感谢您的帮助。

标签: django import foreign-keys


【解决方案1】:

django 模型在大部分情况下在幕后处理链接表。 ForeignKey 字段类型足以完成此操作,然后您只需要使用 ORM 来连接查询中的表。以下是我将如何根据我对您正在寻找的内容的最佳解释来设置您的表格:

from django.db import models


class School(models.Model):
    psid = models.CharField(primary_key=True, max_length=5)
    city = models.CharField(max_length=100)

    def __unicode__(self):
        return u"{0} ({1})".format(self.psid, self.city)


class Score(models.Model):
    school = models.ForeignKey(School, null=False, db_column="psid")
    score = models.IntegerField()

    def __unicode__(sefl):
        return u"Score({0}, {1})".format(self.school.psid, self.score)

然后测试你的模型:

$ ./manage.py syncdb
$ ./manage.py shell
>>> from schools.models import School, Score
>>> school1 = School(psid="S1", city="Springfield")
>>> school1
S1 (Springfield)
>>> school1.save()
>>> School.objects.get(psid="S1")
S1 (Springfield)
>>> school2 = School(psid="S2", city="Springfield")
>>> school2.save()
>>> score1 = Score(school=school1, score=3)
>>> score1
Score(S1, 3)
>>> score1.school.psid
S1
>>> score2 = Score(school=school1, score=2)
>>> score3 = Score(school=school2, score=5)
>>> score1.save()
>>> score2.save()
>>> score3.save()
>>> school1.score_set.all()
[Score(S1, 3), Score(S1, 2)]
>>> school2.score_set.all()
[Score(S2, 5)]
>>> Score.objects.all()
[Score(S1, 3), Score(S1, 2), Score(S2, 5)] 
>>> Score.objects.filter(school__psid="S1")
[Score(S1, 3), Score(S1, 2)]

希望对你有所帮助。

【讨论】:

  • 这很有帮助。我多次使用 shell 代码,这对我来说巩固了一些东西。希望对其他人也一样。
  • 由于某种原因,当我为两个表批量导入数据时,我不“相信”ForeignKey 会起作用,而且我对自己做的 shell 感到不舒服,就像你展示的那样。所以我认为我仍然需要在两个表中都有'psid'。只需按照您的建议(和 Django 文档建议)将 'psid' 设置为 'score' 就是要走的路。再次感谢您花时间阐明这一点。
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 2019-03-16
  • 2020-11-16
  • 2011-03-30
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多