Комбинируйте один к одному и много ко многим (django)

#django #design-patterns #many-to-many #api-design

Вопрос:

У меня есть модель с именем «db_connector» и еще одна «project_site».


«project_site» может иметь много-много отношений с «db-connector». Но «project_site» должен иметь один db-коннектор по умолчанию.


Каков наилучший дизайн-шаблон для этого? Могу ли я объединить «многие ко многим» и «один к одному» следующим образом: отношение «Многие ко многим» для альтернативных соединителей, связанных с сайтом project_site, и один к одному для соединителя по умолчанию, связанного с сайтом project_site?

Пользователь может указать db_connector, если пользователь не указывает database_conector, можно использовать db_connector по умолчанию?


Использование этого шаблона в django вызывает ошибку (поля.E305)

Проект_сайт.alternative_db_connectors: (поля.E305) Обратное имя запроса для ‘Project_site.alternative_db_connectors» конфликтует с обратным именем запроса для «Project_site.default_db_connector». ПОДСКАЗКА: Добавьте или измените аргумент related_name в определение для ‘Project_site.альтернативные_дб_коннекторы» или «Проект_сайт.default_db_коннектор».

Модели project_site выглядят следующим образом:

 class Project_site(models.Model):
    name = models.CharField(max_length=150)
    project_group = models.ForeignKey(Project_Group, on_delete=models.CASCADE)
    default_db_connector = models.OneToOneField(DB_Connector, on_delete=models.CASCADE ,  primary_key=True ,)
    alternative_db_connectors = models.ManyToManyField(DB_Connector)
    def __str__(self) -> str:
        return self.name
 

В терминах SQL это должно быть возможно, верно?

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

1. Используется ли по умолчанию один к одному, потому что одновременно может использоваться только один соединитель?

2. Существует ли логика, какой из них будет использоваться по умолчанию, или он должен храниться для каждого соединения отдельно без логики, определяющей, какой из них является стандартным?

3. Спасибо за ваш ответ, разъем «один к одному» является разъемом по умолчанию, «многие ко многим» должны содержать альтернативные разъемы. Пользователи могут запросить другой разъем, который является той же моделью, что и разъем по умолчанию.

4. Просто используйте уникальные связанные имена

5. Не беспокойтесь. Просто убедитесь, что вы прочитали о related_name , чтобы понять, как это работает