首页 > 解决方案 > 以编程方式在 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))

任何想法将不胜感激。

标签: pythondjango

解决方案


正如 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

推荐阅读