Джанго отношения многие ко многим с дополнительными полями - PullRequest
4 голосов
/ 15 августа 2011

Я создаю простой интерфейс для биологической базы данных, используя django-admin для заполнения базы данных.Я хочу, чтобы Tot использовал отношение «многие ко многим» для вопросника к видам рыб (один вопросник может содержать более одного вида, а один вид может присутствовать в более чем одном вопроснике).Две рассматриваемые модели:

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 ]

4 голосов
/ 15 августа 2011
0 голосов
/ 15 августа 2011

Определите другие модели 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>]
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...