gpt4 book ai didi

django-taggit 在带有 UUID 的模型上作为 pk 在保存时抛出超出范围

转载 作者:行者123 更新时间:2023-12-04 23:44:34 31 4
gpt4 key购买 nike

我有使用 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")

我收到 DataError: integer out of range
当我在游标上导入 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 )显然是导致错误的原因。这个数字是 UUID 的整数为 foo_id
In [6]: foo.foo_id.int                      
Out[6]: 287082253891563438098836942573405313042

有什么我可以设置的允许 django-taggitcontenttypes 玩得很好和 UUID ?

最佳答案

我想扩展@Pramod 的回复,这对我找到正确答案非常有帮助:
标签有另一个类允许更改 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)
来源: http://django-taggit.readthedocs.io/en/latest/custom_tagging.html#genericuuidtaggeditembase

关于django-taggit 在带有 UUID 的模型上作为 pk 在保存时抛出超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31683216/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com