Django ошибка CircularDependencyError

Есть две модели

файл Prices/models.py

import Books.models import Books

class Prices(models.Model):
    book_id = models.ForeginKey(Books, on_delete=models.DO_NOTHING)
    # ... other fields

файл Books/models.py

import Prices.models as pr_model 

class Books(models.Models):
    price_id = models.ForeignKey('Prices.Prices', on_delete=models.DO_NOTHING)
    # ... other field

    def save(self, *args, **kwargs):
        price = pr_model.Prices.objects.all()
        # ... some logic and saving price object or create

При таком импорте пакетов получаю ошибку, что логично

django.db.migrations.exceptions.CircularDependencyError: Books.0001_initial, Prices.0001_initial

То есть, при начальной миграции обеих django приложений, будет выводится ошибка указанная выше. Однако если закоментить в Books импорт и после чего раскомментировать и снова мигрировать данные, то ошибки не будет.

Подскажите, это может повлечь за собой проблемы в дальнейшем ? Может есть более изящный способ сделать такие манипуляции и не нарушать импорт пакетов?


Ответы (1 шт):

Автор решения: Uncle_Ragnar

Если джанго говорит что цикличный вызов это не хорошо, значит это не хорошо. Ваша модель book_id ссылается на модель Books, в вашем случае лучшим решением будет добавить related_name для модели book_id, а из Book/models.py вообще убрать импорт Price/models.py

Вы можете реализовать все вот так:

import Books.models import Books

class Prices(models.Model):
    book_id = models.ForeginKey(Books, related_name'related_book' on_delete=models.DO_NOTHING)

В дальнейшем Вы можете взаимодействовать со связанными моделями таким образом:

В поле Price.book_id будет храниться модель из класса Books, а для модели Books можно использовать такую конструкцию: books.related_book.all() - Это вернет все модели которые будут ссылаться на конкретную модель.

→ Ссылка