python - 以编程方式在 Django 中设置模型的字段
问题描述
说我有模特Food
class Food(models.Model):
description = models.TextField()
toppings = models.TextField()
scheme = models.ForeignKey(FoodScheme, models.CASCADE)
我想要另一个类,FoodScheme
它描述了必须在特定Food
类中设置哪些字段。
class FoodScheme(models.Model):
scheme_name = models.TextField()
requires_description = models.BooleanField(default=False)
requires_toppings = models.BooleanField(default=False)
但我不想硬编码,而是想以编程方式设置这些字段,因此 Food 中的任何更改也会更改 FoodScheme 类。
一个示例实现(由于多种原因,它不起作用,但我认为我的观点得到了理解):
class FoodScheme(models.Model):
scheme_name = models.TextField()
for f in Food.get_fields():
setattr(self, f"requires_{f.name}", models.BooleanField(default=False))
任何想法将不胜感激。
解决方案
正如 iklinac 所建议的,最简单的方法是使用JSONField
. 这允许内容是动态的。
这是一个例子GenericScheme
:
class GenericScheme(models.Model):
scheme_name = models.TextField(default="Unnamed Scheme")
scheme_json = models.JSONField(default=dict)
model = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.scheme_json = {}
self.update()
def update(self):
if self.model is None:
return
for f in self.model._meta.get_fields():
if f.name not in self.scheme_json:
self.scheme_json[f.name] = False
推荐阅读
- php - 是否可以通过php中的锚标记发送用户输入的关键字
- python - 亚马逊销售合作伙伴 API 提要使用 Python 加密文件
- python - 禁止消息 discord.py 上的命令
- reactjs - axios 调用数据返回 useState undefined
- javascript - 使用 Azure 函数从 Azure Blob 存储下载文件会返回不同的文件大小
- ssl - Gradle 未能构建应用程序 - 无法找到请求目标的有效认证路径
- c# - 从未排序的数组中获取有序数组的范围
- python - AWS TimeStream Python SDK:无法创建正确的客户端对象
- python - 如何在 json 中添加数据字段(键值)并针对单个数据字段进行语言检测
- c++ - C++,将所有元素的数据类型更改为嵌套的 C 数组