我正在使用django的ContentType框架为我的模型创建一些通用关系;在看了django开发人员如何在django.contrib.comments.models
做到这一点后,我想我会模仿他们的方法/惯例:
content_type = models.ForeignKey(ContentType,
verbose_name='content type',
related_name="content_type_set_for_%(class)s")
object_pk = models.TextField('object ID')
content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")
这是从他们的源代码中获取的,当然,他们的源代码对我有用(我对于object_pk存储的注释很好(实际上是整数);但是,在syncdb
创建表的过程中我收到错误:
_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'object_pk' used in key specification without a key length")
任何想法为什么他们能做到而我不能?
环顾四周后,我注意到the docs实际上说:
为您的模型提供一个字段,该字段可以存储您要与之相关的模型中的主键值。 (对于大多数模型,这意味着IntegerField或PositiveIntegerField。)
此字段必须与相同类型,与通用关系中涉及的模型的主键相同。例如,如果使用IntegerField,则无法与使用CharField作为主键的模型形成通用关系。
但为什么他们这样做而不是我呢?!
感谢。
PS:我甚至尝试使用这三个字段创建一个AbstractBaseModel,使其成为abstract=True
并使用它(如果与它有关)......同样的错误。
答案 0 :(得分:1)
在输入那个很长的问题后,我查看了mysql,发现错误源于:
class Meta:
unique_together = (("content_type", "object_pk"),)
显然,我无法双管齐下。这让我感到很难受。我将不得不打开一个新问题,是否最好让我的object_pk
选项保持打开状态(假设我使用文本字段作为主键?)或者更好地强制执行unique_togetherness
... < / p>