3

私はいくつかの機能ロジックを(ビューではなく)モデルのメソッドに移動しようとしています。ここでは、それが属していると思います。

class Spans(models.Model):
    snow = models.IntegerField()
    wind = models.IntegerField()
    exposure = models.CharField(max_length=1)
    module_length = models.IntegerField()
    max_roof_angle = models.IntegerField()
    building_height = models.IntegerField()
    importance_factor = models.IntegerField()
    seismic = models.DecimalField(max_digits=4, decimal_places=2)
    zone = models.IntegerField()
    profile = models.CharField(max_length=55)
    tilt_angle = models.IntegerField()
    span = models.DecimalField(max_digits=18, decimal_places=15)

    def get_spans(self, snow_load, wind_speed, module_length):
        """
        Function to get spans.
        """
        spans = self.objects.filter(
            snow=snow_load,
            wind=wind_speed,
            exposure='B',
            module_length__gte=module_length,
            max_roof_angle=45,
            building_height=30,
            importance_factor=1,
            seismic=1.2,
            zone=1,
            profile='worst'
        ).order_by('snow', 'module_length', 'span')
        return spans

しかし、私はそれをどのように呼ぶのか少しわかりません。私が試したシェルでは:

>>> possible_spans = Spans.get_spans(0, 85, 54)

また

>>> possible_spans = Spans.get_spans(Spans, 0, 85, 54)

しかし、エラーが発生します:

TypeError: unbound method get_spans() must be called with Spans instance as first argument (got int instance instead) 

また

TypeError: unbound method get_spans() must be called with Spans instance as first argument (got ModelBase instance instead)  

ここでPythonロジックの基本的なものが欠けていることは知っていますが、それが何であるかはわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

4

メソッド呼び出しはデフォルトの自己引数としてそれを作成するため、メソッドはインスタンスのいずれかで呼び出す必要があります。例えば、

instance = Spans.objects.get(id=1)
instance.get_spans(0, 85, 54)

または、クラス自体を使用して呼び出すことができる場合。インスタンスを手動で渡す必要があります

instance = Spans.objects.get(id=1)
Spans.get_spans(instance, 0, 85, 54)

更新:あなたが探していることは、静的な方法を使用して達成することができます

@staticmethod
def get_spans(snow_load, wind_speed, module_length):
        """
        Function to get spans.
        """
        spans = Spans.objects.filter(
            snow=snow_load,
            wind=wind_speed,
            exposure='B',
            module_length__gte=module_length,
            max_roof_angle=45,
            building_height=30,
            importance_factor=1,
            seismic=1.2,
            zone=1,
            profile='worst'
        ).order_by('snow', 'module_length', 'span')
        return spans

今、あなたは直接行うことができます、

Spans.get_spans(0, 85, 54)
于 2012-11-09T22:53:55.370 に答える