ValidationError:在 Django 中不是有效的 UUID

Posted

技术标签:

【中文标题】ValidationError:在 Django 中不是有效的 UUID【英文标题】:ValidationError: is not a valid UUID in Django 【发布时间】:2018-06-14 13:47:32 【问题描述】:

我正在使用Django 2.0

我有一个Note 表和StarredNotes 表。

最初,没有 id 字段,因为它是由 Django 默认添加为 integer 数据类型的。

现在我已经把模型中id的数据类型改成了UUID

model.py

class Starred(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    note = models.ForeignKey(Note, on_delete=models.CASCADE)

    objects = StarredManager()

class ColorLabels(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=100, unique=True)
    value = models.CharField(max_length=100)
    default = models.BooleanField(default=False)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title + '(' + self.value + ')'

views.py

class StarredNotes(ListView):
    template_name = 'notes/starred.html'
    model = Starred
    context_object_name = 'starred_notes'

    def get_queryset(self):
        starred_notes = Starred.objects.filter(user=self.request.user).order_by('-updated')
        return starred_notes

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super(self.__class__, self).dispatch(request, *args, **kwargs)

urls.py

app_name = 'notes'
urlpatterns = [
    url(r'^$', MyNotes.as_view()),
    url(r'^my/$', MyNotes.as_view(), name='my'),
    path('<pk>/', NoteUpdate.as_view(), name='update'),
    path('share-public/<pk>/', ShareNotePublic.as_view(), name='share-public'),
    path('starred-notes/', StarredNotes.as_view(), name='starred'),
    path('shared-notes/', SharedNotes.as_view(), name='shared'),
    path('delete/<pk>/', DeleteNote.as_view(), name='delete'),
    path('new/', NewNote.as_view(), name='new'),
    path('<pk>/public/', PublicNoteView.as_view(), name='public-view'),
]

但是当我使用

访问视图时
http://127.0.0.1:1234/notes/starred-notes/

错误提示为

ValidationError at /notes/starred-notes/

["'starred-notes' is not a valid UUID."]

【问题讨论】:

你能发布完整的 urlpatterns 列表吗?可能您在 StarredNotes 视图的正上方有详细视图,它由/notes/starred-notes/ url 触发。您需要交换这些模式。 另外请注意,您绝不能在 super 调用中使用 self.__class__,如果您将该视图子类化,您将获得无限回归。 更新urlpatterns 【参考方案1】:

您的path('&lt;pk&gt;/', NoteUpdate.as_view(), name='update'), 模式太常见了,它会拦截已加星标的网址。您需要将其移至列表底部或最好添加 uuid 转换器path('&lt;uuid:pk&gt;/', NoteUpdate.as_view(), name='update')

【讨论】:

以上是关于ValidationError:在 Django 中不是有效的 UUID的主要内容,如果未能解决你的问题,请参考以下文章

Django,在模板中显示 ValidationError

从 django 模型的保存方法中引发 ValidationError?

django.core.exceptions.ValidationError: [u"'' 值无效

django.core.exceptions.validationerror '' 值必须是十进制数 [重复]

如何在 Django 的 views.py 中引发 ValidationError(或做类似的事情)?

Django Postgres objects.create ValidationError