Django моделей, работающих с несколькими внешними ключами - PullRequest
0 голосов
/ 06 августа 2020

Я занимаюсь наборами данных, основанными на пресноводных озерах в США.

Так что мои модели в основном - State и Lake. Состояние является внешним ключом в Lake.

Когда я начал загружать данные, я быстро понял, что похоже, что некоторые Lakes граничат с несколькими штатами. Пример: озеро Эр ie переходит в 4 состояния + международная граница.

Затем мне пришлось немного переосмыслить свои модели и придумал следующее:

class State(models.Model):
    name = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(self.name)

class Lake(models.Model):
    state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name="primary state", related_name="related_primary_state", help_text="Primary State")
    state_secondary = models.ForeignKey(State, on_delete=models.CASCADE, null=True, blank=True, related_name="related_secondary_state", verbose_name="secondary state", help_text="Secondary State")
    state_three = models.ForeignKey(State, on_delete=models.CASCADE, null=True, blank=True, related_name="related_three_state", verbose_name="three state", help_text="three State")
    state_four = models.ForeignKey(State, on_delete=models.CASCADE, null=True, blank=True, related_name="related_four_state", verbose_name="four state", help_text="four State")
    state_five = models.ForeignKey(State, on_delete=models.CASCADE, null=True, blank=True, related_name="related_five_state", verbose_name="five state", help_text="five State")
    name = models.CharField(max_length=200, null=True)
    
    def __str__(self):
        return str(self.name)

Было бы хорошо сделать, или есть лучшие способы подойти к этому?

Спасибо!

1 Ответ

3 голосов
/ 06 августа 2020

Вы могли бы лучше использовать отношение «многие ко многим», например:

class Lake(models.Model):
    states = models.ManyToManyField(State)
    name = models.CharField(max_length=200, null=True)
    
    def __str__(self):
        return str(self.name)

Таким образом, вам не нужно беспокоиться о том, сколько состояний является внешним ключом для данного озера. Затем вы можете связать столько состояний, сколько хотите, с данным озером:

st1 = State(name="test1")
st1.save()
st2 = State(name="test2")
st2.save()
lk1 = Lake(name="lake1")
lk1.save()
lk1.states.add(st1, st2)

Вы можете получить все состояния следующим образом:

>>>> lk1.states.all()
<QuerySet [<State: test1>, <State: test2>]>

Подробности см. В документации: https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...