【问题标题】:Django urls with UUID issue带有 UUID 问题的 Django 网址
【发布时间】:2020-01-24 04:10:13
【问题描述】:

初始错误:当 CustomerID 在 models.py 中为 CharField 时:

在对模型进行更改并使 CustomerID UUIDField 出现以下错误后:

我正在尝试根据 CustomerID 重定向到视图,但它不适用于 UUID。 以前它可以很好地处理整数。

请提出建议。

url.py:

from django.urls import path, include
from . import views

urlpatterns = [
   path('create/', views.create, name='create'),
   path('<uuid:customer_id>', views.detail, name='detail'),
   path('search/customers/<uuid:customer_id>', views.detail, name='detail'),
   path('customers/<uuid:customer_id>', views.detail, name='detail'),
   path('edit/<uuid:customer_id>', views.edit, name='edit'),
   path('modify/<uuid:customer_id>', views.modify, name='modify'),
]

views.py

 @login_required
 def detail(request, customer_id):
     customer = get_object_or_404(CustomerMaster, pk=customer_id)
     return render(request, 'customers/detail.html',{'customer':customer})

models.py

   class CustomerMaster(models.Model):
         customerid = models.UUIDField(db_column='CustomerID', primary_key=True)  # Field name made lowercase.
         customernumber = models.CharField(db_column='CustomerNumber', max_length=50)  # Field name made lowercase.
         customername = models.CharField(db_column='CustomerName', max_length=50)  # Field name made lowercase.
          lastmodifiedutc = models.DateTimeField(db_column='LastModifiedUTC')  # Field name made lowercase.
          lastmodifiedby = models.CharField(db_column='LastModifiedBy', max_length=50)  # Field name made lowercase.
          active = models.BooleanField(db_column='Active')  # Field name made lowercase.
         customershortname = models.CharField(db_column='CustomerShortName', max_length=50, blank=True, null=True)  # Field name made lowercase.


      class Meta:
            managed = False
            db_table = 'Customer_Master'

            def __str__(self):
                return self.CustomerName

【问题讨论】:

  • 能否提供相关型号?
  • @wfehr 我已经更新了模型。请检查。

标签: django python-3.x django-models django-views django-urls


【解决方案1】:

对于UUIDField 看起来您正在使用不正确支持 UUIDField 的 Microsoft SQLServer 数据库....

因此,如果您使用CharField,您可能希望在传入的 uuid 字段上引入正则表达式 UUID 检查:

Searching for UUIDs in text with regex

如前所述,您希望确保 DB 值一致,因此在经过验证的输入上使用 .lower() 是个好主意。

【讨论】:

    【解决方案2】:

    通过将 CustomerID 设为 CharField 并在 URL 中传递字符串参数来解决。

    【讨论】:

    • 不要发布“通过...解决它”的答案,而是将答案标记为已接受,如果它对您有帮助。
    【解决方案3】:

    根据docs,UUID中的字母必须小写:

    uuid - 匹配格式化的 UUID。为防止多个 URL 映射到同一页面,必须包含破折号并且字母必须小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID 实例。

    【讨论】:

    • 数据库中的条目是大写字母。在这种情况下不知道如何处理小写 UUID。
    • 您正在使用 UUIDField,它处理 UUID 与 db 表示之间的转换。换句话说,你如何看待db中的值,不一定是在django中一次处理该值的方式。
    • @monkut - 感谢您的意见。在这种情况下,我如何在执行 get 时在 view.py detail 方法中将小写转换为大写?请看我上面的错误截图。
    • 请不要通过编辑原始问题来添加新问题。您最初的问题是正则表达式不匹配。我建议您将新问题作为另一个问题发布。
    • 这不是一个新问题......我做了修改,但仍然停留在同一个问题“带有 UUID 问题的 Django urls”
    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2020-01-09
    • 2017-07-27
    • 2012-07-05
    • 2011-06-30
    • 2012-03-11
    • 2017-04-06
    相关资源
    最近更新 更多