Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 删除某些元素时模型继承中出现问题_Django_Inheritance_Model - Fatal编程技术网

Django 删除某些元素时模型继承中出现问题

Django 删除某些元素时模型继承中出现问题,django,inheritance,model,Django,Inheritance,Model,我在模型继承中使用了一个代码段。它一开始工作正常。然而,在我删除了数据库中的一些元素之后,代码就错了。 在调试过程中,我发现问题在于方法:As_leaf_类。 在以下代码中: if (model == Meal): return self return model.objects.get(id=self.id) 删除元素时,最后一行将引发异常。 有人能给出一个解决方案吗 具有内容类型和继承感知管理器的模型继承 from django.db import models from djan

我在模型继承中使用了一个代码段。它一开始工作正常。然而,在我删除了数据库中的一些元素之后,代码就错了。 在调试过程中,我发现问题在于方法:As_leaf_类。 在以下代码中:

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()

我不知道这个片段现在是否仍然相关,您可以使用它


这允许您声明一个不是db表的模型,但其他模型可以从中继承。

第一个答案:为什么要在已删除的对象上调用as\u leaf\u类?如果你那样做很痛,就不要这样做


第二个答案是,您可以用try…except-fine.DoesNotExist来包装失败的行,并返回None或self或其他内容。

请告诉我们引发了什么异常。反对者?堆栈跟踪可能会有所帮助。仍然有基于表的模型继承的用例(如果你问我的话,虽然不是很多)。