Django与额外字段的多对多关系

时间:2011-08-15 00:34:23

标签: django many-to-many

我正在使用django-admin构建一个简单的生物数据库接口来填充数据库。我希望使用多对多的关系来对鱼类进行问卷调查(一个调查问卷可以有一个以上的物种,一个物种可以存在于一个以上的问卷中)。这两个模型有问题:

class Species(models.Model):
    fish_spp_name = models.CharField(max_length=255, unique=True)


class Questionaire(models.Model):
    # ...
    fish_caught = models.ManyToManyField(Species)

现在,我希望我的数据包含每个调查问卷中捕获的每个物种的数量。因此,举例来说,我可以将3个不同的物种与问卷id = 1联系起来,但我如何将其包括在内,例如第一个物种中的2个,第二个中的1个和第三个中的4个被捕获?

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:-3)

定义另一个模型Caught以保存每个捕获的信息。给它一个related_name,以便在代码中更容易引用。您可能还需要unique_together个适当的字段。

class Species(models.Model):
    name = models.CharField(max_length=255, unique=True)

    def __unicode__(self):
        return '%s/%d' % self.name

class Questionaire(models.Model):
    pass

class Caught(models.Model):
    species = models.ForeignKey(Species)
    number = models.IntegerField()
    questionaire = models.ForeignKey(
        Questionaire, related_name='catches')

    def __unicode__(self):
        return '%s/%d' % (self.species.name, self.number)

像这样使用:

(InteractiveConsole)
>>> from app.models import *
>>> s1 = Species(name='Salmon')
>>> s1.save()
>>> s2 = Species(name='Mackerel')
>>> s2.save()
>>> q = Questionaire()
>>> q.save()
>>> c1 = Caught(species=s1, number=7, questionaire=q)
>>> c2 = Caught(species=s2, number=5, questionaire=q)
>>> c1.save()
>>> c2.save()
>>> q.catches.all()
[<Caught: Salmon/7>, <Caught: Mackerel/5>]
>>>