【问题标题】:Problem in Model inheritance when some elements are deleted删除某些元素时模型继承的问题
【发布时间】:2010-10-17 13:08:39
【问题描述】:

我在http://www.djangosnippets.org/snippets/1034/ 中使用了一个sn-p 来继承我的模型。一开始它工作得很好。但是,在我删除数据库中的一些元素后,代码会出错。 在调试时,我发现问题出在方法中:as_leaf_class。 在以下代码中:

if (model == Meal):
    return self
return model.objects.get(id=self.id)

当元素被删除时,最后一行将引发异常。 任何人都可以为此提供解决方案?

具有内容类型和继承感知管理器的模型继承

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.db.models.query import QuerySet

class SubclassingQuerySet(QuerySet):
    def __getitem__(self, k):
        result = super(SubclassingQuerySet, self).__getitem__(k)
        if isinstance(result, models.Model) :
            return result.as_leaf_class()
        else :
            return result
    def __iter__(self):
        for item in super(SubclassingQuerySet, self).__iter__():
            yield item.as_leaf_class()

class MealManager(models.Manager):
    def get_query_set(self):
        return SubclassingQuerySet(self.model)

class Meal (models.Model) :
    name = models.TextField(max_length=100)
    content_type = models.ForeignKey(ContentType,editable=False,null=True)
    objects = MealManager()

    def save(self, *args, **kwargs):
        if(not self.content_type):
            self.content_type = ContentType.objects.get_for_model(self.__class__)
            super(Meal, self).save(*args, **kwargs)

    def as_leaf_class(self):
        content_type = self.content_type
        model = content_type.model_class()
        if (model == Meal):
            return self
        return model.objects.get(id=self.id)

class Salad (Meal) :
    too_leafy = models.BooleanField(default=False)
    objects = MealManager()

【问题讨论】:

  • 请告诉我们引发了什么异常。对象不存在?堆栈跟踪可能会有所帮助。

标签: django inheritance model


【解决方案1】:

第一个答案:您为什么要在已删除的对象上调用 as_leaf_class ?如果这样做时会感到疼痛,请不要这样做。

第二个答案是你可以用 try...except Meal.DoesNotExist 包裹失败的行,并返回 None 或 self 或其他东西。

【讨论】:

    【解决方案2】:

    现在你可以使用abstract base classes.,我不知道那个 sn-p 是否仍然相关

    这使您可以声明一个不是 db 表但其他模型可以继承的模型。

    【讨论】:

    • 仍然有基于表的模型继承的用例(虽然不是很多,如果你问我的话)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2014-09-05
    • 2020-02-13
    • 2011-11-15
    • 2016-04-29
    • 2019-11-09
    相关资源
    最近更新 更多