背景
我有三个模型:AppVersion
、App
和 DeployApp
。在 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
实例时不会出现异常?
unique_together
很快就会过时。请查看 UniqueConstraint。 - zar3bski