#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 — Тот же вопрос к вам .. .. Как вы думаете, мне все еще нужно включать отношения между банком и клиентом? Спасибо