Проблема с добавлением правил перед удалением объектной модели - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть две независимые модели Budget и Conversion, как показано ниже.

class Budget(models.Model):
    budget = models.FloatField(null=False, blank=False)
    currency = models.ForeignKey(to=Currency, on_delete=models.PROTECT, null=False, blank=False)
    date = models.DateField(null=False, blank=False, unique=False)
class Conversion(models.Model):
    currency = models.ForeignKey(to=Currency, on_delete=models.PROTECT, null=False, blank=False)
    rate = models.FloatField(null=True, blank=False)
    date = models.DateField(null=False, blank=True, unique=False)

Я хочу добавить правило перед удалением преобразования объекта.Конверсию не следует удалять, если существует бюджет, который зависит от него.

Есть много сообщений об удалении объекта django, но я не смог найти приемлемого решения, у всех них есть недостатки.

То, что я пытался:

  • Переопределение метода .delete() и повышение ValidationError -> возвращает ошибку сервера.
  • Реализация @receiver(pre_delete, sender=Conversion) и выдача ValidationError -> возвращает ошибку сервера
  • Переопределенный метод .clean() не вызывался при использовании Delete from admin.

Я был бы очень признателен за решение, которое позволило бы мне запретить пользователю удалять объекты конверсии и не возвращать ошибку 500.

Спасибо

1 Ответ

0 голосов
/ 21 февраля 2019

Ваш вопрос не имеет смысла.Вы говорите, что объект Conversion не следует удалять, если существует объект Budget, который зависит от него.Но в настоящее время у вас нет связи между моделями Conversion и Budget в вашей базе данных.Они оба ссылаются на внешние ключи на Currency, но это не имеет прямого отношения к ним.

Если вы хотите каким-либо образом связать Conversion и Budget, вы можете добавить внешний ключ с on_delete=models.Protectвот так:

class Budget(models.Model):
    budget = models.FloatField(null=False, blank=False)
    currency = models.ForeignKey(to=Currency, on_delete=models.PROTECT, null=False, blank=False)
    date = models.DateField(null=False, blank=False, unique=False)
    conversion = models.ForeignKey(to=Conversion, on_delete=models.PROTECT)

Теперь попробуйте навести Budget на Conversion, а затем удалить Conversion.Джанго не позволит тебе сделать это.

...