Могут ли две модели ссылаться друг на друга по 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_names.

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

Это проще и менее запутанно.

Вернуться на верх