Хранение информации о лайках и фолловерах в разных моделях дает ошибку: скорее всего, из-за циклического импорта
У меня есть две модели: Product
и User
class Product(models.Model):
#here are information fields about Product
likes = models.ManyToManyField(
User, related_name="product_likes", blank=True)
object = models.Manager()
productobjects = ProductObjects()
def __str__(self):
return self.name
class User(AbstractBaseUser, PermissionsMixin):
#here are information fields about User
followed = models.ManyToManyField(
Product, related_name="followed_products", blank=True)
objects = CustomAccountManager()
object = models.Manager()
def __str__(self):
return self.email
Внутри Product
мне нужно иметь likes
поле ManyToMany, которое хранит информацию о том, какой продукт понравился пользователю. Внутри User
мне нужно иметь followed
поле ManyToMany, которое хранит, за какими продуктами следит пользователь.
У меня ошибка: cannot import name 'Product' from partially initialized module 'product.models' (most likely due to a circular import)
. Как я могу ее исправить? Или, может быть, я могу сделать это по-другому?
Я думаю, проблема в том, что внутри product.models
я импортирую: from users.models import User
и внутри users.models
я импортирую: from product.models import Product
.
(Я использую likes
только для получения количества лайков, но из followed
мне нужно получить все продукты, за которыми следит указанный пользователь, и информацию о них)
Ваша Product
модель должна импортировать User
модель и наоборот. В результате импорт застрял в бесконечном цикле.
Однако вы можете использовать строковый литерал, чтобы указать, на какую модель указывает ваш ManyToManyField
. Например:
# no import of the models module where you define User
class Product(models.Model):
#here are information fields about Product
likes = models.ManyToManyField(
'app_name.User', related_name="product_likes", blank=True
)
# ⋮
Здесь app_name
- имя приложения, в котором вы определили (пользовательскую) модель пользователя.
Поскольку это (скорее всего) модель пользователя, здесь можно использовать настройку AUTH_USER_MODEL
[Django-doc]:
# no import of the models module where you define User
from django.conf import settings
class Product(models.Model):
#here are information fields about Product
likes = models.ManyToManyField(
settings.AUTH_USER_MODEL, related_name="product_likes", blank=True
)
# ⋮