首页 > 解决方案 > models.py 中的 Django 过滤器关系

问题描述

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

类别/模型.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()

帖子/模型.py

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)

模板.html:

<h5>Number of Post elements: {{ category.posts }}</h5>

可悲的是,这总是导致以下错误:

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

标签: pythondjango

解决方案


这可能是因为您导入Posts.models了您的Categories.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()

但是您不需要导入此模型。Django 会自动创建反向关系。如果您不指定related_name, 即modelname_set, 那么您可以通过以下方式访问它:

# 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):
        return self.post_set.count()

注意:Python 模块通常是用snake_case而非PerlCase 编写的,所以应该是category,而不是Category


推荐阅读