在 views.py 中从 models.py 调用方法而不创建实例
Calling methods from models.py inside views.py without creating instance
来自 .NET 的 Django 新手,有架构问题。
在我的 models.py
里面,我有一个叫做 city
的概念。这些城市可以是 enabled/disabled.
在我的视图中,我想检索我名为 Cities
的视图下的所有活跃城市。我需要在很多地方检索所有活跃的城市,所以我想我会在我的 models.py
城市 class 中创建一个名为 get_in_country
的方法,所以它看起来像这样:
class City(models.Model):
title = models.CharField(max_length=200)
alias = models.CharField(max_length=200)
country = models.ForeignKey(Country, null=True)
is_visible = models.BooleanField(default=False)
def __str__(self):
return self.title
def get_in_country(self, country_id):
#return best code ever seen
无论如何,我现在的问题是:如何在 views.py
中使用它?
作为一个很棒的菜鸟,我当然尝试过这个:
def country(request, alias):
cities_in_country = City.get_in_country(1) #whatever id
data = {
'cities_in_country': cities_in_country,
}
return render(request, 'country.html', data)
现在,您不必成为爱因斯坦(咳咳,Jon Skeet?)也能意识到这会出错,因为我没有创建 City 的实例并且会导致异常:
unbound method get_in_country() must be called with City instance as first argument (got int instance instead)
那么:您将如何修改我的代码以使用我新的很棒的子方法?
您需要将 get_in_country
定义为 static function
通过添加装饰器
@staticmethod
就在 class 防御之前
@staticmethod
def get_in_country(self, country_id):
class City(models.Model):
title = models.CharField(max_length=200)
alias = models.CharField(max_length=200)
country = models.ForeignKey(Country, null=True)
is_visible = models.BooleanField(default=False)
def __str__(self):
return self.title
@staticmethod # Changed here
def get_in_country(self, country_id):
来自 .NET 的 Django 新手,有架构问题。
在我的 models.py
里面,我有一个叫做 city
的概念。这些城市可以是 enabled/disabled.
在我的视图中,我想检索我名为 Cities
的视图下的所有活跃城市。我需要在很多地方检索所有活跃的城市,所以我想我会在我的 models.py
城市 class 中创建一个名为 get_in_country
的方法,所以它看起来像这样:
class City(models.Model):
title = models.CharField(max_length=200)
alias = models.CharField(max_length=200)
country = models.ForeignKey(Country, null=True)
is_visible = models.BooleanField(default=False)
def __str__(self):
return self.title
def get_in_country(self, country_id):
#return best code ever seen
无论如何,我现在的问题是:如何在 views.py
中使用它?
作为一个很棒的菜鸟,我当然尝试过这个:
def country(request, alias):
cities_in_country = City.get_in_country(1) #whatever id
data = {
'cities_in_country': cities_in_country,
}
return render(request, 'country.html', data)
现在,您不必成为爱因斯坦(咳咳,Jon Skeet?)也能意识到这会出错,因为我没有创建 City 的实例并且会导致异常:
unbound method get_in_country() must be called with City instance as first argument (got int instance instead)
那么:您将如何修改我的代码以使用我新的很棒的子方法?
您需要将 get_in_country
定义为 static function
通过添加装饰器
@staticmethod
就在 class 防御之前
@staticmethod
def get_in_country(self, country_id):
class City(models.Model):
title = models.CharField(max_length=200)
alias = models.CharField(max_length=200)
country = models.ForeignKey(Country, null=True)
is_visible = models.BooleanField(default=False)
def __str__(self):
return self.title
@staticmethod # Changed here
def get_in_country(self, country_id):