Django中的代理类型和外键

时间:2012-03-15 14:18:33

标签: django django-models proxy-classes

是否可以将代理模型实例用于外键?

这样做有任何缺点或风险吗?

示例代码:

base_models.py

class BaseWidget(models.Model):
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=100)

class BasePart(models.Model):
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=100)
    widget = models.ForeignKey(BaseWidget, related_name="parts")

models.py

from base_models import BaseWidget, BasePart

class Part(BasePart):
    class Meta:
        proxy = True

class Widget(BaseWidget):
    def replace_part(self, old_code, new_code):
        self.parts.filter(code=old_code).delete()
        self.parts.add(Part.objects.get(code=new_code))
    class Meta:
        proxy = True

请注意,在replace_part中,它正在添加Part,而不是BasePart。这就是我想知道的 - 这是否是Django可以接受的,如果有的话,这样做是否有任何隐藏的缺点或危险。

1 个答案:

答案 0 :(得分:1)

完全可以接受。请记住,就像使用任何子类而不是父类一样,然后将它限制为只有那个孩子及其中的任何子项,即使在代理类的场景中,子项与父项基本相同