gpt4 book ai didi

python - Django 唯一约束

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:13 27 4
gpt4 key购买 nike

上下文

我有模型 AppVersionAppDeployApp。在 AppVersion 模型中,用户可以将 APK 文件上传到文件系统。我正在使用 pre_save 信号来防止为特定 App 上传具有相同 version_code 的 APK 文件,如下所示:

@receiver(pre_save, sender=AppVersion)
def prevent_duplicate_version_code(sender, instance, **kwargs):
qs = AppVersion.objects.filter(app_uuid=instance.app_uuid, version_code=instance.version_code)
if qs.exists():
raise FileExistsError("Version code has to be unique for a specific app")

这个信号做了我想要的,除了当我试图在桥接表 DeployApp 中创建一个对象时它也会引发错误。

模型

# models.py

class App(models.Model):
app_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
app_name = models.CharField(max_length=100)


class AppVersion(models.Model):
app_version_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
app_uuid = models.ForeignKey(App, on_delete=models.CASCADE, related_name='app_versions')
app_version_name = models.CharField(max_length=100)
version_code = models.IntegerField(blank=True, null=True, editable=False)
source = models.FileField(upload_to=get_app_path, storage=AppVersionSystemStorage())


class DeployApp(models.Model):
deploy_app_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
app_version = models.ForeignKey(AppVersion, on_delete=models.CASCADE)
device_group = models.ForeignKey(DeviceGroup, on_delete=models.CASCADE)
release_date = UnixDateTimeField()

我的猜测是,当创建 DeployApp 的对象时,相关的 AppVersion 也会被保存,因此会调用 pre_save 信号并引发异常。

我还尝试覆盖 AppVersion 模型的 save() 方法,但结果是一样的。

如何确保异常仅在创建新的 AppVersion 实例时发生,而在添加或编辑 DeployApp 实例时不会发生?

最佳答案

感谢 Bear Brown 的建议,解决了这个问题。我删除了信号并将 UniqueConstraint 添加到 AppVersion 模型中,如下所示:

class Meta:
db_table = 'app_version'
constraints = [
models.UniqueConstraint(fields=['app_uuid', 'version_code'], name='unique appversion')
]

关于python - Django 唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56024059/

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