Импорт классов моделей из других приложений без циклической ссылки в Django - PullRequest
1 голос
/ 19 февраля 2020

У меня 3 приложения, продукты, продажи, покупки. Каждое приложение имеет соответственно названный класс Модель, Продукт, Продажа и Покупка.

products/models.py
class Product(models.Model):
    Name = models.CharField(max_length=32)

sales/models.py
class Sale(models.Model):
    Product = models.ForeignKey('products.Product', on_delete=models.CASCADE)

purchases/models.py
class Purchase(models.Model):
    Product = models.ForeignKey('products.Product', on_delete=models.CASCADE)

И я решил создать собственные менеджеры для классов Модели, чтобы я мог хранить все логи c в модели. файлы (переопределяя объекты attr для каждого класса), когда я пишу методы в настраиваемом менеджере, я импортировал модель продажи. В products.models и модели Product в sales.models, которая создает циклическую ссылку, я смог сойти с рук. выполняя импорт в самих методах, но я помню, как читал в Интернете, что циклический импорт является признаком неправильной записи кода.

Поэтому мой вопрос заключается в том, как в этом случае избежать циклического импорта и получить доступ к модели продукта в sales.models и продажа в products.models.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Вы можете импортировать модель по имени , чтобы избежать циклического импорта. Когда вам нужно использовать модель, импортируйте ее так:

from django.apps import apps

ModelName = apps.get_model(app_label='app_name', model_name='ModelName')
1 голос
/ 19 февраля 2020

Запуск по циклическому импорту означает, что вы боретесь с созданным разделением или не пишете должным образом разделенный код. В вашем случае, я думаю, вы слишком стараетесь разделить эти модели на отдельные приложения. Безусловно, продажи и покупки являются частью одного и того же набора функций и разделяют множество бизнес-логи c. Даже продукты могут жить в одном приложении, хотя у вас может быть больше аргументов.

Если вы пришли с другого языка, где принято не иметь несколько классов в одном файле, вы должны знать, что не лучшая практика в python. Обратите внимание, что в официальном учебнике Django приложение polls содержит модели Question и Answer в одном файле.

Я думаю, что одно приложение с именем commerce со всеми тремя моделями в тот же файл models.py будет иметь смысл.

# commerce/models.py

class Product(models.Model):
    name = models.CharField(max_length=32)


class Sale(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)


class Purchase(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
...