在Django Model

时间:2016-05-02 15:19:49

标签: python django sqlite

我正在制作一个有助于在游戏中记录任务的程序。在这些任务中,我希望能够从宇航员表中选择一些宇航员。当我只需要一个时,这很好,但我怎么能在一个字段中接近多个外键?

我目前使用'二进制'字符串指定哪些宇航员与任务相关联(1指的是Jeb,但不是Bill,Bob或Val,0001表示只有Val),第一个数字指定宇航员id为1等等。这很有效,但感觉非常笨重。

这是这两个表的model.py。

class astronauts(models.Model):
    name = models.CharField(max_length=200)
    adddate = models.IntegerField(default=0)
    experience = models.IntegerField(default=0)
    career = models.CharField(max_length=9, blank=True, null=True)
    alive = models.BooleanField(default=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Kerbals"

class missions(models.Model):

    # mission details
    programid = models.ForeignKey(programs, on_delete=models.SET("Unknown"))
    missionid = models.IntegerField(default=0)
    status = models.ForeignKey(
        missionstatuses, on_delete=models.SET("Unknown"))
    plan = models.CharField(max_length=1000)

    # launch
    launchdate = models.IntegerField(default=0)
    crewmembers = models.IntegerField(default=0)

    # recovery
    summary = models.CharField(max_length=1000, blank=True)
    recdate = models.IntegerField(default=0)

    def __str__(self):
        return str(self.programid) + '-' + str(self.missionid)

    class Meta:
        verbose_name_plural = "Missions"

我看到一篇关于“中间链接表”的帖子来存储工作人员列表,但这也不太理想。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是Django的ManyToManyField的用例。更改任务中的相应字段:

class missions(models.Model):
    crewmembers = models.ManyToManyField('astronauts')

你可以从宇航员模型一侧访问它,如下所示:

jeb = astronaut.objects.get(name='Jebediah Kerman')
crewed_missions = jeb.missions_set.all()

或者像任务一样:

mission = missions.objects.order_by('?')[0]
crew = mission.crewmembers.all()

这会在数据库中创建另一个表,以防您在某种程度上成为问题。