【发布时间】:2016-07-30 23:57:13
【问题描述】:
我最近一直在阅读有关泛型关系的文章。我知道GenericForeignKey 是使用ForeignKey 和PositiveIntegerField 字段定义和管理通用关系。我潜入源代码寻找GenericForeignKey 的__set__ 方法,看看它是如何工作的。
这是GenericForeignKey.__set__() 的sn-p:
def __set__(self, instance, value):
ct = None
fk = None
if value is not None:
ct = self.get_content_type(obj=value)
fk = value._get_pk_val()
setattr(instance, self.ct_field, ct)
setattr(instance, self.fk_field, fk)
setattr(instance, self.cache_attr, value)
以及来自 django docs example 的模型定义:
class TaggedItem(models.Model):
tag = models.SlugField()
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
问题:
当我将guido 的值分配给content_object 时,每个参数的值是多少:GenericForeignKey.__set__() 中的self、instance 和value?
是self=<GenericForeignKey: 1>、instance='content_object' 和value=<User: guido>?
>>> guido = User.objects.get(username='Guido')
>>> t = TaggedItem(content_object=guido, tag='bdfl')
>>> t.save()
【问题讨论】:
-
继续阅读descriptor protocol!这是一个有用的答案:stackoverflow.com/a/34554353/674039
标签: python django django-contenttypes