我想写一个泛型函数来配对两个数据库字段

2024-10-03 23:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个团队,"red""black"。假设我有一个Story类,它以两种非常不同的方式呈现相似的信息,具体取决于您的团队:

class Story(models.Model):
    red_title = models.CharField()
    black_title = models.CharField()

    red_prologue = models.TextField()
    black_prologue = models.TextField()

    # ... and so on ...

    def get_field(self, genericName, team):
        """Return the field with suffix genericName belonging to the given team.

        >>>self.get_field("prologue", "red") is self.red_prologue
        True
        >>>self.get_field("title", "black") is self.black_title
        True

        """
        assert(team in ["red", "black"])
        specificName = "{}_{}".format(team, genericName)
        return self.__dict__[specificName]

我对getter函数很满意,但我觉得我应该能够重构最初创建字段的代码。我想要一个如下的函数:

def make_fields(self, genericName, fieldType, **kwargs):
    """Create two fields with suffix genericName.

    One will be 'red_{genericName}' and one will be 'black_{genericName}'.

    """
    for team in ["red", "black"]:
        specificName = "{}_{}".format(team, genericName)
        self.__dict__[specificName] = fieldType(**kwargs)

但是self__dict__在第一次定义类时是没有意义的,我认为Django要求数据库字段是类变量而不是实例变量。你知道吗

所以。。。有没有办法在Django中创建这个make_fields函数,还是我运气不好?你知道吗


Tags: 函数selffieldfieldsgettitlemodelsred
2条回答

不,Django模型不应该被视为可以动态构造的东西;它是数据库表的Python表示。例如,在运行syncdb之后更改specificName格式的语义是什么?没有明确的,明显的答案-所以Django没有试图回答它。列是在类级别定义的,仅此而已。你知道吗

(在某种程度上,您可以深入到内部ORM数据结构并设置这些字段—但您所做的只是将自己暴露在一个充满歧义和定义不明确的问题的世界中。不要这样做。)

不知道你为什么要这么做。更理智的模式是:

TEAMS = (
    ("r","red"),
    ("b","black"),
)

class Story(models.Model):
    team = models.CharField(max_length=1, choices=TEAMS)
    title = models.CharField()
    prologue = models.TextField()

您当前的模型正在创建大量重复的列(对于红色和黑色),这些列只应由列本身定义。使用上面的模型,您的查询就像Story.objects.filter(team="r")。你知道吗

这样就根本不需要get_field函数了。你知道吗

相关问题 更多 >