Хранение информации о лайках и фолловерах в разных моделях дает ошибку: скорее всего, из-за циклического импорта

У меня есть две модели: 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
    )
    # ⋮
Вернуться на верх