2016-05-02 3 views
0

Я делаю программу, которая помогает лог-миссии в игре. В каждой из этих миссий я хотел бы выбрать нескольких космонавтов, которые будут вместе с ним из таблицы астронавтов. Это нормально, когда мне нужен только один, но как я могу подойти к нескольким внешним ключам в поле?Ссылка на несколько внешних ключей в Django Model

В настоящее время я использую двоичную строку, которая указывает, какие астронавты должны быть связаны с миссией (1 относится к Джебу, но не Биллу, Бобу или Валу, а 0001 означает только Val), с первой цифрой, указывающей астронавт с идентификатором 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" 

Я видел сообщение о «промежуточной связующей таблице», чтобы сохранить список членов экипажа, но это также не является идеальным.

Спасибо!

+0

Можете ли вы использовать «ManyToManyField»? – jape

ответ

0

Это пример использования для Django's 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() 

Этот создает другую таблицу в базе данных, если это как-то проблема для вас.

+0

Спасибо, что нашли время ответить. Я читал много-к-одному и помнил, что меня удивляло, что многих-ко-многим не существует. Похоже, я просто искал не то место! – arlyon

Смежные вопросы