Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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-查询和删除GenericForeignKey_Django_Django Queryset_Django Orm_Django Contenttypes - Fatal编程技术网

django-查询和删除GenericForeignKey

django-查询和删除GenericForeignKey,django,django-queryset,django-orm,django-contenttypes,Django,Django Queryset,Django Orm,Django Contenttypes,假设这是一个模型,作为ContentType的外键: class Photo(models.Model): user = models.ForeignKey(User) description = models.TextField() image = models.ImageField(upload_to=get_upload_file_name) pub_date = models.DateTimeField(auto_now=True, auto_now_ad

假设这是一个模型,作为
ContentType
的外键:

class Photo(models.Model):
    user = models.ForeignKey(User)
    description = models.TextField()
    image = models.ImageField(upload_to=get_upload_file_name)
    pub_date = models.DateTimeField(auto_now=True, auto_now_add=False)
class Entry(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    pub_date = models.DateTimeField()
    content_object = generic.GenericForeignKey('content_type','object_id')
这是
ContentType
的一个模型:

class Photo(models.Model):
    user = models.ForeignKey(User)
    description = models.TextField()
    image = models.ImageField(upload_to=get_upload_file_name)
    pub_date = models.DateTimeField(auto_now=True, auto_now_add=False)
class Entry(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    pub_date = models.DateTimeField()
    content_object = generic.GenericForeignKey('content_type','object_id')
每当创建新照片或状态时,也会创建一个新的
条目
。现在,我想要的是,每当我删除
照片
/
状态
的实例时,我都想从
条目
中删除与该照片/状态相关的对象?我该怎么做

我试过这个:

def delete_entry(sender, **kwargs):
    instance = kwargs['instance']
    try:
        si = Entry.objects.get(object_id=instance.id)
        si.delete()
    except Entry.DoesNotExist:
        si = None
有时它起作用了。但有时我也会犯错误:

MultipleObjectsReturned
get() returned more than one Entry -- it returned 2!

所以,我想,这不是办法。请帮我解决这个问题。谢谢大家!

这是因为在
GenericForeignKey
中实际上可能存在重复的ID。例如,如果您有一个
照片
模型和一个
文章
模型,两者都有一个与之关联的
条目
,那么照片的主键可以与文章的主键的值相同,
对象id
将相同。这就是为什么首先需要
内容类型
对象id

要获得正确的对象,需要同时检查类型和id

from django.contrib.contenttypes.models import ContentType

def delete_entry(sender, instance, **kwargs):
    content_type = ContentType.objects.get_for_model(instance)
    entry = Entry.objects.get(content_type=content_type, 
                              object_id=instance.id)
    entry.delete()
实现这一点的另一种方法是使用
generirelation
(请参阅)。这是
GenericForeignKey
的反向关系。无论何时删除具有
GenericRelation
的对象,都会将指向该实例的
GenericForeignKey
级联到所提供模型的任何对象:

from django.contrib.contenttypes.generic import GenericRelation

class Photo(models.Model):
    ...
    entries = GenericRelation(Entry, content_type_field='content_type', 
                              object_id_field='object_id')

我看不出这种与一般相关的方法是有效的。相反,在删除之后,我仍然拥有具有较早的.object\u id.And.content\u object为None的条目实例。为什么不删除条目实例?我做错了什么?所以我知道我的原因。我在写一些公司代码。GenericRelation属性不是在模型内部添加的,而是使用apps.py中的.ready()方法整体添加的。这是我们的错误,因为已经很晚了。反向链接工作正常(可能是在django中使用惰性定义处理的),但级联删除失败。