这是我目前在我的模型中拥有的。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
之间的关系没有中断?
答案 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为此创建索引,然后性能不会有所不同。
这是您的问题吗?