[英]How to create property methods in django models dynamically?
我正在為每個 model 創建屬性方法,其中 model 屬性包括 ImageField 或 FileField。 因此,我決定制作一個抽象的 model 來檢查 model 中的字段,如果 model 中有任何 ImageField 和 FileField,該屬性方法會自動創建它。
我通常在創建方法時將“_url”添加到屬性中
下面是我通常做的
class MyModel(models.Model):
image = ImageField(...)
file = FileField(...)
...
@property
def image_url(self):
if self.image and hasattr(self.image, 'url'):
return self.image.url
@property
def file_url(self):
if self.file and hasattr(self.file, 'url'):
return self.file.url
...
低於我到目前為止所做的
class MyModel(models.Model):
...
def __new__(cls, value):
fields = self._meta.get_fields()
for field in fields:
if isinstance(field, ImageField) or isinstance(field, FileField):
???
有什么建議么?
使用混合。
class ImageUrlMixin:
@property
def image_url(self):
if self.image and hasattr(self.image, "url"):
return self.image.url
class FileUrlMixin:
@property
def file_url(self):
if self.file and hasattr(self.file, "url"):
return self.file.url
class FileImageUrlMixin(FileUrlMixin, ImageUrlMixin):
pass
class OnlyHasFileFieldModel(FileUrlMixin, models.Model):
# ..model implementation
class OnlyHasImageFieldModel(ImageUrlMixin, models.Model):
# ..model implementation
class HasBothFileAndImageFieldModel(FileImageUrlMixin, models.Model):
# ..model implementation
或者,如果您想動態支持字段,例如my_model.arbitrary_field_url
:
class DynamicFieldUrlMixin:
def __getattr__(self, name):
if name.endswith("_url"):
field_name = "".join(name.split("_")[:-1])
field = getattr(self, field_name, None)
if hasattr(field, "url"):
return field.url
raise AttributeError
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.