Python models.py中的Django筛选器关系

Python models.py中的Django筛选器关系,python,django,Python,Django,假设在两个单独的应用程序中出现以下情况,我想计算模板中特定类别的帖子元素数: Categories/models.py from Posts.models import Post ... class Category(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) title = models.CharField(max_length=20, ve

假设在两个单独的应用程序中出现以下情况,我想计算模板中特定类别的帖子元素数:

Categories/models.py

from Posts.models import Post
...
class Category(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=20, verbose_name="Title")
    ...

    @property
    def posts(self):
        return Post.objects.filter(category_id=self.id).count()
class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(verbose_name="Title")
    content = models.TextField(verbose_name="Content")
    tag = models.CharField(verbose_name="Meta", max_length=70, blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
Posts/models.py

from Posts.models import Post
...
class Category(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=20, verbose_name="Title")
    ...

    @property
    def posts(self):
        return Post.objects.filter(category_id=self.id).count()
class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(verbose_name="Title")
    content = models.TextField(verbose_name="Content")
    tag = models.CharField(verbose_name="Meta", max_length=70, blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
template.html:

<h5>Number of Post elements: {{ category.posts }}</h5>
Post元素数:{{category.posts}
遗憾的是,这总是导致以下错误:

ImportError:无法从部分初始化的 模块“Posts.models”(很可能是由于循环导入)


这可能是因为您在
类别中导入了
Posts.models
,反之亦然。您可以将其导入属性本身:

# no from Posts.models import Post

# …

class Category(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=20, verbose_name="Title")
    # …

    @property
    def posts(self):
        from Posts.models import Post
        return Post.objects.filter(category_id=self.id).count()
注意:Python模块通常用snake_大小写,而不是PerlCase,因此 应该是
类别
,而不是
类别


这可能是因为您在
类别中导入了
Posts.models
,反之亦然。您可以将其导入属性本身:

# no from Posts.models import Post

# …

class Category(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=20, verbose_name="Title")
    # …

    @property
    def posts(self):
        from Posts.models import Post
        return Post.objects.filter(category_id=self.id).count()
注意:Python模块通常用snake_大小写,而不是PerlCase,因此 应该是
类别
,而不是
类别


您应该尝试在属性中使用相关名称:

类别(models.Model):
id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
title=models.CharField(最大长度=20,详细名称=“title”)
...
@财产
def员额(自我):
返回self.post_set.count()

此外,就记录而言,在不同的应用程序中有
类别
Post
似乎有些奇怪。很可能它们应该在一个
博客
应用程序中。循环导入通常意味着您有两个应用程序耦合得太紧。在这种情况下,它可能只是一个应用程序。

您应该尝试在您的属性中使用相关名称:

类别(models.Model):
id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
title=models.CharField(最大长度=20,详细名称=“title”)
...
@财产
def员额(自我):
返回self.post_set.count()

此外,就记录而言,在不同的应用程序中有
类别
Post
似乎有些奇怪。很可能它们应该在一个
博客
应用程序中。循环导入通常意味着您有两个应用程序耦合得太紧。在这种情况下,它可能只是一个应用程序。

提示在错误中,因为您确实有一个循环导入

Posts.models.py将在顶部显示来自Categories.models import Category的
,因为您将其用作外键,并且现在在Category的Posts方法中使用Post,因此它将显示来自Posys.models import Post的

您需要修复此问题,这可以通过以下三种方式之一实现,具体取决于您是否有其他模型或方法使用Categories模型中的Post类

如果你这样做了,那么你可以使用这两种方法中的一种

  • 将foreignKey更改为传入字符串而不是类别对象,以便
  • class Post(models.Model):
    id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
    author=models.ForeignKey(用户,on_delete=models.CASCADE)
    title=models.CharField(verbose_name=“title”)
    content=models.TextField(verbose_name=“content”)
    tag=models.CharField(verbose_name=“Meta”,max_length=70,blank=True)
    category=models.ForeignKey(“category”,on_delete=models.CASCADE,null=True)
    
  • 将导入从posts方法中Categories/models.py的顶部移动,以便在本地导入
  • 类别(models.Model):
    id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
    title=models.CharField(最大长度=20,详细名称=“title”)
    @财产
    def员额(自我):
    从Posts.models导入Post
    return Post.objects.filter(category\u id=self.id).count()
    
    如果您没有,并且我们无法从您发布的内容判断,那么您可以在Category类中使用与``post\u set``相关的名称,并完全避免导入


    这也将解决问题

    提示在错误中,因为您确实有一个循环导入

    Posts.models.py将在顶部显示来自Categories.models import Category的
    ,因为您将其用作外键,并且现在在Category的Posts方法中使用Post,因此它将显示来自Posys.models import Post的

    您需要修复此问题,这可以通过以下三种方式之一实现,具体取决于您是否有其他模型或方法使用Categories模型中的Post类

    如果你这样做了,那么你可以使用这两种方法中的一种

  • 将foreignKey更改为传入字符串而不是类别对象,以便
  • class Post(models.Model):
    id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
    author=models.ForeignKey(用户,on_delete=models.CASCADE)
    title=models.CharField(verbose_name=“title”)
    content=models.TextField(verbose_name=“content”)
    tag=models.CharField(verbose_name=“Meta”,max_length=70,blank=True)
    category=models.ForeignKey(“category”,on_delete=models.CASCADE,null=True)
    
  • 将导入从posts方法中Categories/models.py的顶部移动,以便在本地导入
  • 类别(models.Model):
    id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
    title=models.CharField(最大长度=20,详细名称=“title”)
    @财产
    def员额(自我):
    从Posts.models导入Post
    return Post.objects.filter(category\u id=self.id).count()
    
    如果您没有,并且我们无法从您发布的内容判断,那么您可以在Category类中使用与``post\u set``相关的名称,并完全避免导入


    这也将解决该问题

    不需要该属性,您可以按照外键ba访问相关对象
    @property
    def post_count(self):
        return self.post_set.count()
    
    <h5>Number of Post elements: {{ category.post_count }}</h5>