Quero criar um objeto que contenha 2 links para usuários. Por exemplo:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
mas estou recebendo os seguintes erros ao executar o servidor:
O acessador do campo 'target' entra em conflito com o campo relacionado 'User.gameclaim_set'. Inclua um argumento related_name na definição de 'target'.
O acessador do campo 'reivindicador' entra em conflito com o campo relacionado 'User.gameclaim_set'. Inclua um argumento related_name na definição de 'reivindicador'.
Você pode explicar por que estou recebendo os erros e como corrigi-los?
python
django
django-models
Oleg Tarasenko
fonte
fonte
related_name
na documentação] ** ( docs.djangoproject.com/en/dev/ref/models/fields/#arguments ) explica por que elas ocorrem.Respostas:
Você tem duas chaves estrangeiras para o usuário. O Django cria automaticamente uma relação inversa entre o Usuário e o GameClaim, o que geralmente é
gameclaim_set
. No entanto, como você tem dois FKs, você teria doisgameclaim_set
atributos, o que é obviamente impossível. Então você precisa dizer ao Django qual nome usar para a relação inversa.Use o
related_name
atributo na definição de FK. por exemplofonte
O
User
modelo está tentando criar dois campos com o mesmo nome, um para osGameClaims
que têm issoUser
como otarget
e outro para osGameClaims
que têm issoUser
como oclaimer
. Aqui estão os documentosrelated_name
, que é a maneira do Django permitir que você defina os nomes dos atributos para que os gerados automaticamente não entrem em conflito.fonte
O OP não está usando uma classe base abstrata ... mas, se estiver, você descobrirá que a codificação embutida do related_name no FK (por exemplo ..., related_name = "myname") resultará em vários desses erros de conflito - um para cada classe herdada da classe base. O link fornecido abaixo contém a solução alternativa, que é simples, mas definitivamente não é óbvia.
Dos documentos do django ...
Mais informações aqui .
fonte
Às vezes, você precisa usar formatação extra
related_name
- na verdade, a qualquer momento em que a herança é usada.Nenhum conflito aqui, mas o related_name é definido uma vez e o Django cuidará da criação de nomes de relações exclusivos.
em filhos da classe Value, você terá acesso a:
fonte
Parece que me deparei com isso ocasionalmente quando adiciono um submódulo como aplicativo a um projeto django, por exemplo, dada a seguinte estrutura:
Se eu adicionar o seguinte ao INSTALLED_APPS:
O Django parece processar o arquivo myapp.mymodule models.py duas vezes e gera o erro acima. Isso pode ser resolvido não incluindo o módulo principal na lista INSTALLED_APPS:
Incluir o em
myapp
vez demyapp.module
faz com que todas as tabelas do banco de dados sejam criadas com nomes incorretos, portanto essa parece ser a maneira correta de fazer isso.Me deparei com este post enquanto procurava uma solução para este problema, então pensei em colocar isso aqui :)
fonte
Basta adicionar a resposta da Jordan (obrigado pela dica Jordan) também pode acontecer se você importar o nível acima dos aplicativos e depois importar os aplicativos, por exemplo
myproject/ apps/ foo_app/ bar_app/
Portanto, se você estiver importando aplicativos, foo_app e bar_app, poderá obter esse problema. Eu tinha aplicativos, foo_app e bar_app, todos listados nas configurações.INSTALLED_APPS
E você deseja evitar a importação de aplicativos de qualquer maneira, porque você tem o mesmo aplicativo instalado em 2 namespaces diferentes
apps.foo_app
efoo_app
fonte