将UUIDField转换为CharField

时间:2018-09-26 07:03:12

标签: python django django-models

这是我目前在我的模型中拥有的。py:

class Campaign(models.Model):
    campaign_id = UUIDField(auto=True)
    name = models.CharField("Campaign Name", max_length=255)

class CampaignResponse(models.Model):
    campaign = models.ForeignKey(Campaign)
    user = models.EmailField("Email", max_length=200)
    response = models.TextField()

最近,我正在考虑将Campaign模型中的campaign_id从UUIDField更改为CharField,但是当我尝试这样做时,我注意到campaign_id的数据正在更改(例如,数据在使用"7182c679f72844ca83c9648a120bb066"时是UUIDField,但现在转换为"7182c679-f728-44ca-83c9-648a120bb066"后变成CharField

我是否需要执行一些步骤,以便可以在不更改数据的情况下将UUIDField转换为CharField,并确保Campaign和CampaignResponse之间的关系没有中断?

2 个答案:

答案 0 :(得分:1)

campaign_id不是模型Campaign的主键。但这可能是最好的,因为现在将UUID转换为CharField时,您的关系不会中断。

首先创建campaign_id CharField

campaign_id = models.CharField(max_length=36, ) # add other stuff too which you want like unique etc.

关于从uuid转换为str,打开外壳py manage.py shell并运行以下命令:

from myApp.models import Campaign
for c in Campaign.objects.all():
    c.campaign_id = str(c.campaign_id).replace('-', '')

检查数据库以确保其正常工作。现在,您可以将CharField的max_length减小到32,因为campaign_id中所有多余的破折号(-)都消失了。

仅仅因为字段是UUID并不意味着它是主键。要使字段成为主键,您需要传递primary_key=True。您可以像这样

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

答案 1 :(得分:0)

两个评论者是正确的,此处的UUID不是您的主键。与您的广告系列有关的所有外键均具有主键(PK),此处仅是一个自动递增的整数。

不幸的是,出于您担心的确切原因,有时更改主键有时会很痛苦。我之前已经经历过,这是我的建议:

保留主键不变。这将确保您在关系方面不会有任何问题。如果您希望UUID字段能够查找对象或传递引用,而不会出现由整数PK引起的潜在问题。这样的问题的一个示例是,如果您使用的是REST API,那么如果有人看到此链接,就会显得很奇怪: GET / campaigns / 6 <-因为他们知道只是尝试 GET / campaigns / 7 他们会看到原本不该看到的东西。

显然获取 / campaigns / 7182c679-f728-44ca-83c9-648a120bb066 更好。

您可以在UUID字段中添加unique = True以确保django为此创建索引,然后性能不会有所不同。

这是您的问题吗?