python - 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”(很可能是由于循环导入)
解决方案
这可能是因为您导入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
推荐阅读
- c# - 为什么我的 unity android apk 大小太大?
- c# - 将 webjob(Microsoft.Azure.WebJobs) 包更新到 3.0.16 版后,没有发生显式死信
- powershell - Windows 删除所有供应商和 node_modules
- spring-boot - 如何添加“授权:承载
" 在使用 Springdoc Open API 3 Spec 的 OAuth2 隐式流的标头中 - sql-server - SQL Server:外键引用无效表
- php - 连接 MariaDB10 Synology 时数据包乱序
- javascript - 我只需要禁用提交表单后选中的复选框:
- java - Collection 接口中的哪些 LinkedLists 是单一的还是双重的?
- python - 在相同的情况下进行正则表达式替换
- javascript - 转译器之战:突破嵌套函数,有 vs 无 throw