gpt4 book ai didi

python - Django 在运行时添加模型方法

转载 作者:太空宇宙 更新时间:2023-11-03 19:11:38 26 4
gpt4 key购买 nike

我想在运行时添加方法到我的 django 模型中,以便可以通过管理界面查看它。意义:用户应该能够添加 CalculationRule,并且应用的规则会出现一个“虚拟”表。

# model.py
from django.db import models
import types

def rule(self):
return 12 * self.calorific_requirement

class BuildingTable(models.Model):
building_nr = models.IntegerField()
square_meter = models.FloatField()
calorific_requirement = models.FloatField()

@staticmethod
def __new__(cls, *args, **kwargs):
setattr(cls, "rule", types.MethodType(rule, cls))
return models.Model.__new__(cls, *args, **kwargs)

def reqirement_per_m2(self): # this is also a rule!
return self.calorific_requirement / self.square_meter

def __unicode__(self):
return "Building " + str(self.building_nr)

class CalculationRule(models.Model):
name = models.CharField(max_length=200)
rule = models.CharField(max_length=200)

def __unicode__(self):
return str(self.name)

但是,如果我将“rule”添加到我的 admin.py 中,它会引发 BuldingTableAdmin.list_display[4],“rule”不是“BuldingTableAdmin”的可调用属性或属性,也不是找到的在模型“BuildingTable”中。

# admin.py
from calccols_app.models import BuildingTable, CalculationRule
from django.contrib import admin

class BuldingTableAdmin(admin.ModelAdmin):
list_display = ["building_nr", "square_meter", "calorific_requirement", "reqirement_per_m2", "rule"]

admin.site.register(BuildingTable, BuldingTableAdmin)
admin.site.register(CalculationRule)

我已经在 django 的 shell 中测试了 BuildingTablerule 方法存在,但无法正常工作。我有什么想法可以注入(inject)方法,以便 django 可以处理/注册它们吗?

最佳答案

您无需在模型中创建字段即可在管理中显示它。您可以在 ModelAdmin 实体中执行此操作。

class UserAdmin(admin.ModelAdmin):
list_display = ['username', 'fullname']

def fullname(self, model):
return model.first_name + " " + model.second_name

尽管我们可以动态地向您的模型添加方法。但您必须将其视为方法,而不是属性:

def _status(invite):
if invite.is_activated:
return "Activated"
if invite.is_alive:
return "Live"
return "Expired"

_status.short_description = 'status'
Invite.status = _status # Invite is model class

此“属性”通常显示在管理和 Django 模板中。

关于python - Django 在运行时添加模型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12769804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com