Qual é o related_name
argumento útil para on ManyToManyField
e ForeignKey
fields? Por exemplo, dado o código a seguir, qual é o efeito related_name='maps'
?
class Map(db.Model):
members = models.ManyToManyField(User, related_name='maps',
verbose_name=_('members'))
related_name
modo. Se você sabe que não vai usá-lo, acho que é uma coisa boa. Essa é uma opinião pessoal, é claro.+
meios não criam relação inversaRespostas:
O
related_name
atributo especifica o nome da relação reversa doUser
modelo para o seu modelo.Se você não especificar a
related_name
, o Django criará automaticamente uma usando o nome do seu modelo com o sufixo_set
, por exemploUser.map_set.all()
.Se você não especificar, por exemplo,
related_name=maps
noUser
modelo,User.map_set
continuará a funcionar, mas aUser.maps.
sintaxe é, obviamente, um pouco mais limpo e menos desajeitado; por exemplo, se você tiver um objeto de usuáriocurrent_user
, poderá usarcurrent_user.maps.all()
para obter todas as instâncias do seuMap
modelo que tenham uma relaçãocurrent_user
.A documentação do Django tem mais detalhes.
fonte
related_name='maps+'
no exemplo acima?related_name
,_set
ainda funciona emdjango1.11 >
??related_name
especificado,_set
não funciona mais.Para adicionar um nome relacionado à resposta existente, é necessário que haja 2 FKs no modelo que apontam para a mesma tabela. Por exemplo, no caso de lista técnica
Então, quando você precisar acessar esses dados, poderá usar apenas nomes relacionados
Não está funcionando de outra forma (pelo menos não pude usar o nome relacionado no caso de 2 FKs na mesma tabela.)
fonte
related_name
deve ser plural. Porque as relações ForeignKey retornam vários objetos.O
related_name
argumento também é útil se você tiver nomes de classes relacionados mais complexos. Por exemplo, se você tiver um relacionamento de chave estrangeira:Para acessar
UserMapDataFrame
objetos do relacionadoUser
, a chamada padrão seriaUser.usermapdataframe_set.all()
, o que é bastante difícil de ler.O uso de
related_name
permite especificar um nome mais simples ou legível para obter a relação inversa. Nesse caso, se você especificaruser = models.ForeignKey(User, related_name='map_data')
, a chamada será entãoUser.map_data.all()
.fonte
O parâmetro de nome relacionado é realmente uma opção. Se não o definirmos, o Django criará automaticamente o outro lado da relação para nós. No caso do modelo Map, o Django teria criado um
map_set
atributo, permitindo o acessom.map_set
no seu exemplo (estou sendo sua instância de classe). A fórmula que o Django usa é o nome do modelo seguido pela string_set
. O parâmetro name relacionado simplesmente substitui o padrão do Django em vez de fornecer um novo comportamento.fonte
prefetch_related
use para pré-buscar dados para Muitos para muitos e muitos para um dado de relacionamento.select_related
é selecionar dados de um único relacionamento de valor. Ambos são usados para buscar dados de seus relacionamentos de um modelo. Por exemplo, você constrói um modelo e um modelo que tem um relacionamento com outros modelos. Quando uma solicitação chega, você também consulta seus dados de relacionamento e o Django possui mecanismos muito bons. Para acessar dados do relacionamento, comobook.author.name
quando você itera uma lista de modelos para buscar seus dados de relacionamento, o Django cria cada solicitação para todos os dados de relacionamento. Para superar isso, temosprefetchd_related
eselected_related
fonte