Como faço para o campo muitos-para-muitos opcional no Django?

202

Quando você tem um relacionamento muitos-para-muitos ( related_namenão through) e está tentando usar a interface administrativa, é necessário inserir um dos relacionamentos, mesmo que ele não precise existir para você criar a primeira entrada.

Estou criando um aplicativo que é um organizador de eventos. Imagine que tínhamos Evente Groupmodelos ligados a um relacionamento muitos-para-muitos.

O Django related_namecria outra tabela com os índices das outras duas tabelas.
Mas não vejo nenhuma razão pela qual esta tabela extra tem de ser preenchido.

Se eu trabalho com o banco de dados através do phpMyAdmin, posso criar um Groupsem registrar um Event, já que a conexão entre os dois é apenas através de uma tabela separada e não há imposição de valor no banco de dados em um determinado nível.

Como faço para que a interface do administrador perceba isso?
Como faço para o campo muitos-para-muitos opcional no Django?

DZ.
fonte

Respostas:

348

Se você deseja especificar a relação ManyToMany sem precisar dela, basta usar blank=True:

class Group(models.Model):
    ...
    events = models.ManyToManyField(Event, blank=True)
Ludwik Trammer
fonte
7
Isso resolve o problema. Usar o espaço em branco não era tão óbvio para mim, porque eu pensei que muitos criaram uma tabela que vincula os eventos aos grupos (events = models.ManyToManyField (Event, related_name = "groups", blank = True) Portanto, não estava claro o uso o espaço em branco desde Evento não é realmente um campo na tabela do grupo Enfim funcionou tão obrigado !!!.
. DZ
9
@ouse Acho que sim, em branco é para validação de django e nulo para o banco de dados. Neste tipo de caso (como por IntegerField) não faz sentido colocar um sem o outro eu acho
lajarre
17
Você realmente precisa ter null=True? Eu estava sob a impressão nullnão tem qualquer efeito sobre ManyToManycampos: stackoverflow.com/questions/18243039/...
Tyler Hayes
5
Sim, hum @TylerHayes está certo. null = True é basicamente um no-op e não faz sentido no contexto de um ManyToMany. Estou aberto a mostrar como estou enganado.
Ben Roberts
7
null = True não é necessário, pelo menos a partir do Django 1.5.
Ville Laurikari