Модель отношений Django

#django #model #relationship

#django #Модель #отношения

Вопрос:

Здесь немного сложно.

Итак, в настоящее время у меня есть модельный клиент и модельный банк. Одним из полей в модели банка является сумма. Я рассуждал следующим образом: у клиента может быть счет в нескольких банках, а у банка может быть несколько клиентов. Следовательно -> ManyToMany. Проблема сейчас в том, что я могу указать только 1 сумму для всех учетных записей, которые есть у клиента… Как я могу это решить? Создать другую модель? Один на один? большое спасибо за вклад

Лучшие,

Ответ №1:

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

 class BankAccount(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    bank = models.ForeignKey(Bank, on_delete=models.CASCADE)
    amount = models.PositiveIntegerField()
    date_opened = models.DateField()

  

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

Комментарии:

1. Привет, Уильям! Спасибо… Как вы думаете, мне все еще нужно включать отношения между банком и клиентом? Спасибо

2. Нет, потому что у вас уже есть «сквозное» это. В любом случае, с человеческой точки зрения, когда вы думаете об этом, вы должны спросить банковский счет, какому банку он принадлежит, а не Джо напрямую. Итак, что-то вроде bankaccount.bank или в данном случае client.bankaccount.bank должно сказать вам об этом.

Ответ №2:

Вы бы хотели, чтобы было разделение проблем. Итак, с точки зрения моделей, должны быть Client , Bank и BankAccount . Нет необходимости в отношениях «многие ко многим» на клиенте.

 class Client(models.Model):
    name = models.CharField()


class Bank(models.Model):
    name = models.CharField()


class BankAccount(models.Model):
    CHECKING = 'C'
    SAVINGS = 'S'

    TYPE = (
        (CHECKING, 'Checking'),
        (SAVINGS, 'Savings'),
    )

    client = models.ForeignKey(Client, related_name="bankAccountAsClient", on_delete=models.CASCADE)
    bank = models.ForeignKey(Bank, related_name="bankAccountAsBank", on_delete=models.CASCADE)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    type = models.CharField(max_length=1, choices=TYPE)
  

Таким образом, вы можете получить банковские счета клиентов, используя BankAccount.objects.filter(client=client)

Комментарии:

1. Это отношение «многие ко многим»; вы только что добавили несколько дополнительных полей в промежуточную таблицу, которая связывает Client и Bank.

2. @ENDREBOOTH верно, я имел в виду, что ему не нужен manytomany на Client , поскольку ему нужны дополнительные поля. Спасибо за разъяснение

3. Действительно. Я пропустил «на клиенте», приносим извинения.

4. @EndreBoth никаких извинений! Я отредактировал свой ответ, чтобы уточнить, основываясь на вашем комментарии. Мы высоко ценим ваше разъяснение.

5. Привет, Hybrid amp; Endre — Тот же вопрос к вам .. .. Как вы думаете, мне все еще нужно включать отношения между банком и клиентом? Спасибо