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中使用惰性定义处理的),但级联删除失败。