如何在 django 中声明和调用在关系中导航的模型方法?
Posted
技术标签:
【中文标题】如何在 django 中声明和调用在关系中导航的模型方法?【英文标题】:How to declare and call a model method navigating through relations in django? 【发布时间】:2013-07-27 15:56:06 【问题描述】:我有 3 个模型
class Room(models.Model):
house = models.ForeignKey('Property', related_name='rooms')
beds = models.IntegerField(max_length=10)
class Property(models.Model):
......
def free_places():
places = 0
for r in self.rooms:
x = r.beds - ((r.tenant).size())
places = places + x
return places
class Profile(model.Models):
room = models.ForeignKey(Room, blank=True, null=True, related_name='tenant')
首先我想知道free_places方法应该是:free_places(self)还是free_places()。我认为它也有一些错误,但我不知道如何测试它,所以这里的问题是如何调用该方法?它的功能是否正确? 我想从 django 模板中调用它。
要从“./manage.py shell”尝试,我需要什么?
谢谢
【问题讨论】:
【参考方案1】:应该是free_places(self):
您可以将方法定义为属性,然后从模板中调用它:
https://docs.djangoproject.com/en/dev/topics/db/models/#model-methods
该代码块中的最后一个示例
def _free_places(self):
places = 0
for r in self.rooms:
x = r.beds - ((r.tenant).size())
places = places + x
return places
free_places = property(_free_places)
【讨论】:
仍然无法正常工作,但这是因为功能本身。我用 return 0 尝试了你的建议,在这种情况下工作正常。知道该方法有什么问题吗? @ConradKurtz 是的。对不起。也应该这样回答。据我所知,Size 既不是 Python 内置方法,也不是 Django 查询集方法。如果我正确地解释了您的意图,它应该是: r.beds - (len(r.tenant.all())) 我建议将配置文件外键上的相关名称更改为 room 到“租户”,但是,因为这更准确地描述了这种关系。在这种配置中,一个房间可以有多个配置文件。以上是关于如何在 django 中声明和调用在关系中导航的模型方法?的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 中使用“Self”关键字和一对多关系调用属性