Storing likes and follows informations in different models gives me error: most likely due to a circular import

Storing likes and follows informations in different models gives me error: most likely due to a circular import

我有两个模型:ProductUser

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 指向的模型。例如:

# <b>no</b> import of the models module where you define User

class Product(models.Model):
    #here are information fields about Product

    likes = models.ManyToManyField(
        <strong>'<em>app_name</em>.User'</strong>, related_name="product_likes", blank=True
    )
    # ⋮

此处 app_name 是您在其中定义(自定义)用户模型的应用的名称。

既然是(可能)用户模型,你在这里可以使用AUTH_USER_MODEL setting [Django-doc]:

# <b>no</b> 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(
        <strong>settings.AUTH_USER_MODEL</strong>, related_name="product_likes", blank=True
    )
    # ⋮