Могут ли две модели ссылаться друг на друга по ForeignKey?
У меня есть две модели
class Customer(models.Model):
name = models.CharField(max_length=255, unique=True)
default_contact = models.ForeignKey("CustomerContact", verbose_name="...", related_name="default_contacts", null=True, on_delete=models.SET_NULL)
etc.
И
class CustomerContact(models.Model):
customer = models.ForeignKey(Customer, related_name='contacts')
user = models.OneToOneField(User, related_name='user_contacts', on_delete=models.SET_NULL)
address = models.ForeignKey(CustomerAddress, ....)
В данном примере Customer указывает на CustomerContact. В то же время CustomerContact указывает на Customer.
Мой коллега говорит, что указание точек Customer на CustomerContact нарушает природу OneToMany в ForeignKey
.
Что я делаю неправильно?
Как я вижу, вы хотите иметь много CustomerContact
, связанных с одним Customer
, но Customer
также может выбрать свой любимый (или один может быть установлен менеджером). Это правильный подход.
Это может происходить в обоих направлениях, если только вы правильно закрепите related_name
s.
default_contact = models.ForeignKey("CustomerContact", ... related_name="default_contacts") <= should be changed
default_contacts
должно быть изменено (т.е. на default_for_customers
), потому что это имя для обратного отношения, то есть фактически для CustomerContact
. Это означает, что вы можете использовать его в следующей ситуации:
cc = CustomerContact.objects.get(id=1)
cc.default_for_customers.all() <= this will return QuerySet of Customer objects that is default for
Это проще и менее запутанно.