Python models.py中的Django筛选器关系
假设在两个单独的应用程序中出现以下情况,我想计算模板中特定类别的帖子元素数: Categories/models.pyPython 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
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>