如何在 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”关键字和一对多关系调用属性

如何在 django 导航栏下拉列表中显示活动链接?

如何在用户导航期间在 Django 中保存自定义用户模型

如何在 Entity Framework 中强制沿导航关系进行完整加载?

如何在 Django 中向多对多关系中添加字段?

Django 多外键导航