Подтвердить что ты не робот

Модели Django ForeignKey атрибут on_delete: полный смысл?

Здесь приведены некоторые модели:

class UserProfile(models.Model):  
    name = models.CharField(max_length=30)
    email = models.EmailField(unique=True, db_index=True) 
    birthday = models.DateField()

class Photo(models.Model):
    user = models.ForeignKey(UserProfile)
    description = models.TextField(blank=True)
    photo = models.ImageField(upload_to='img/photo')

Скажем, у пользователя 10 фотографий (10 объектов модели Photo). Когда пользователь удалит себя, все эти 10 Photo строк базы данных автоматически удаляются? (Я читал документы, но английский не является моим родным языком, поэтому я не понял все об атрибуте on_delete.)

4b9b3361

Ответ 1

что поведение по умолчанию, да. вы можете изменить это поведение с помощью on_delete

чтобы получить иллюстрацию этого, попробуйте удалить userprofile в admin. сначала отображается страница предупреждения, в которой перечислены все связанные объекты, которые также будут удалены.

Ответ 2

Я рассмотрю значения для on_delete, поскольку они применяются к этому случаю. Как отмечается в документах, все они находятся в этом модуле models, поэтому вы должны использовать его как models.ForeignKey(UserProfile, on_delete=models.CASCADE) и т.д.

Эти правила применяются, однако вы удаляете объект, независимо от того, выполняете ли вы его на панели администратора или работаете непосредственно с экземпляром Model. (Но он не вступает в силу, если вы работаете напрямую с базой данных в SQL.)

  • CASCADE: при удалении UserProfile все связанные Photo также будут удалены. Это значение по умолчанию. (Так что в ответ на этот аспект вашего вопроса, да, если вы удалите свою учетную запись, фотографии будут удалены автоматически.)

  • PROTECT: это остановит вас при удалении UserProfile со связанными Photo s, если вы попытаетесь создать django.db.models.ProtectedError. Идея заключалась бы в том, что пользователю нужно было бы отключить или удалить все Photo, прежде чем они смогут удалить свой профиль.

  • SET_NULL: при удалении UserProfile все связанные с ним Photo все равно будут существовать, но больше не будут связаны ни с одним UserProfile. Это потребовало бы null=True в определении ForeignKey.

  • SET_DEFAULT: при удалении UserProfile все связанные с ним Photo будут изменены, чтобы указать их по умолчанию UserProfile, как указано атрибутом default в определении ForeignKey (вы может использовать это для передачи "потерянных" фотографий определенному пользователю - но это не будет распространено, SET_NULL или SET() будет гораздо более распространенным)

  • SET(): при удалении UserProfile целевой объект Photo s 'ForeignKey будет установлен в значение, переданное в функцию SET, или то, что оно возвращает, если это вызываемый. (Извините, я не очень хорошо объяснил это, но docs имеет пример, который лучше объясняет.)

  • DO_NOTHING: при удалении UserProfile все связанные с этим Photo останутся неизменными, и, следовательно, будут иметь неработающую ссылку, если вы не использовали какой-либо другой SQL, чтобы позаботиться об этом.

(Кроме того, on_delete не является методом. Это атрибут поля ForeignKey.)