it-swarm-pt.tech

Django modela o atributo ForeignKey on_delete: significado completo?

Aqui estão alguns modelos:

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')

Digamos que um usuário tenha 10 fotos (10 objetos do modelo Photo). Quando o usuário se exclui, todas essas 10 Photo linhas do banco de dados são excluídas automaticamente? (Li documentos, mas o inglês não é minha língua nativa, por isso não entendi tudo sobre o on_delete atributo.)

46
Vitalii Ponomar

esse é o comportamento padrão, sim. você pode alterar esse comportamento com on_delete

para obter uma ilustração disso, tente excluir um perfil de usuário no administrador. primeiro mostra uma página de aviso, listando todos os objetos relacionados que também serão excluídos

20
second

Analisarei os valores de on_delete Conforme eles se aplicam a este caso. Como observado nos documentos, todos estão no módulo models, então você o usaria como models.ForeignKey(UserProfile, on_delete=models.CASCADE), etc.

Essas regras se aplicam, no entanto, você exclui um objeto, seja no painel de administração ou trabalhando diretamente com a instância Model. (Mas não entrará em vigor se você trabalhar diretamente com o banco de dados subjacente no SQL.)

  • CASCADE: quando você excluir o UserProfile, todos os Photos relacionados também serão excluídos. Esse é o padrão. (Portanto, em resposta a esse aspecto da sua pergunta, sim, se você excluir sua conta de usuário, as fotos serão excluídas automaticamente.)

  • PROTECT: isso impedirá que você exclua um UserProfile com Photos relacionados, aumentando um Django.db.models.ProtectedError se você tentar. A idéia seria que o usuário precisasse desassociar ou excluir todos os Photos antes de poder excluir seu perfil.

  • SET_NULL: Quando você excluir o UserProfile, todos os Photos associados ainda existirão, mas não serão mais associados a nenhum UserProfile. Isso exigiria null=True Na definição ForeignKey.

  • SET_DEFAULT: Quando você excluir o UserProfile, todos os Photos associados serão alterados para apontar para o padrão UserProfile conforme especificado por default atributo na definição ForeignKey (você pode usar isso para passar fotos "órfãs" para um determinado usuário - mas isso não será comum, SET_NULL ou SET() será muito mais comum)

  • SET(): quando você exclui o UserProfile, o destino dos Photos 'ForeignKey será definido como o valor passado para o SET função ou o que ele retorna se for possível chamar. (Desculpe, eu não expliquei isso muito bem, mas o docs tem um exemplo que explica melhor.)

  • DO_NOTHING: Quando você excluir os UserProfile, todos os Photos relacionados permanecerão inalterados, tendo uma referência quebrada, a menos que você tenha usado algum outro SQL para cuidar dele.

(Além disso, on_delete Não é um método. É um atributo do campo ForeignKey.)

178
Chris Morgan