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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/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
UUID为pk的模型上的django taggit在保存时超出范围_Django_Django Taggit_Django Contenttypes - Fatal编程技术网

UUID为pk的模型上的django taggit在保存时超出范围

UUID为pk的模型上的django taggit在保存时超出范围,django,django-taggit,django-contenttypes,Django,Django Taggit,Django Contenttypes,我有一些使用UUID作为PK的模型 class Foo(models.Model): foo_id = models.UUIDField( primary_key=True, default=uuid.uuid4, editable=False ) tags = TaggableManager() 当我尝

我有一些使用UUID作为PK的模型

class Foo(models.Model):        
    foo_id = models.UUIDField(  
        primary_key=True,             
        default=uuid.uuid4,           
        editable=False                
    )  
    tags = TaggableManager()        
当我尝试添加新标签时

f = Foo.objects.latest('pk')
f.tags.add("testing")
我得到
数据错误:整数超出范围

当我在光标上导入pdb以查看进入的SQL时,我看到了这一点

(Pdb) params                                                                                                              
(1, 287082253891563438098836942573405313042, 9)                                                                           
(Pdb) sql                                                                                                                 
'INSERT INTO "taggit_taggeditem" ("tag_id", "object_id", "content_type_id") VALUES (%s, %s, %s) RETURNING "taggit_taggedit
m"."id"'    
试图插入的长整数(
287082253891563438098836942573405313042
)显然是错误的原因。此数字是
foo\u id

In [6]: foo.foo_id.int                      
Out[6]: 287082253891563438098836942573405313042  

我是否可以设置一些东西来允许
django-taggit
很好地处理
contenttypes
UUID

以下是一个基于奥斯汀评论的答案

django taggit
中,对标记模型的引用存储在名为
GenericTaggedItemBase
的模型中,该模型位于名为
object\u id
的字段下。
object\u id
字段硬编码为
models.IntegerField
。因此,不可能标记具有UUID主键的模型。代码是

如果所有需要标记的模型都属于同一类型(在本例中为
models.UUIDField
),则可以将
object\u id
的类型设置为
models.UUIDField

假设您使用的是
virtualenvwrapper

  • 在site packages文件夹中找到
    taggit
    包<代码>~/virtualenvs//lib//site packages/taggit

  • taggit
    目录复制到项目中

  • 网站包中删除
    taggit
    目录

  • taggit
    中的
    models.py
    文件中,替换

  • object\u id=models.IntegerField(详细名称=(object id)),db\u index=True)
    with

    object_id = models.UUIDField(verbose_name=_('Object id'), db_index=True)
    
  • 迁移taggit
    python manage.py makemigrations taggit


    python manage.py migrate

    我想扩展@Pramod response,这对我找到正确答案非常有帮助:

    Taggit有另一个类,允许更改
    TaggedItem

    以下是如何实现此解决方案的一个片段:

    from django.db import models
    from django.utils.translation import ugettext_lazy as _
    
    from taggit.managers import TaggableManager
    from taggit.models import GenericUUIDTaggedItemBase, TaggedItemBase
    
    class UUIDTaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
        # If you only inherit GenericUUIDTaggedItemBase, you need to define
        # a tag field. e.g.
        # tag = models.ForeignKey(Tag, related_name="uuid_tagged_items", on_delete=models.CASCADE)
    
        class Meta:
            verbose_name = _("Tag")
            verbose_name_plural = _("Tags")
    
    class Food(models.Model):
        id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
        # ... fields here
    
        tags = TaggableManager(through=UUIDTaggedItem)
    

    来源:

    我最终得到了taggit的一个副本,并修改了模型以使用UUID,使其与我的UUID字段兼容。注意:同步数据库之前,您还需要更改迁移文件。将taggit包复制到我自己的目录时,我只是更新了迁移,而不是运行makemigrations。它们需要更新或删除,然后进行迁移