Tengo un conjunto de objetos de documento y etiqueta, y quiero que esos dos objetos se vinculen. Es una relación típica de muchos a muchos. Tengo el siguiente código:¿Cuándo y cómo se crea una relación muchos a muchos al guardar un modelo?
Models.py:
class Document(models.Model):
title = models.CharField(max_length=50, unique=True)
title_slug = models.SlugField(max_length=50, unique=True, editable=False)
labels = models.ManyToManyField('Label')
def save(self, *args, **kwargs):
self.title_slug = slugify(self.title)
super(Document, self).save(*args, **kwargs)
class Label(models.Model):
name = models.CharField(max_length=40, unique=True)
slug = models.SlugField(max_length=40, unique=True, editable=False)
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Document, self).save(*args, **kwargs)
Views.py:
class DocumentForm(ModelForm):
class Meta:
model = Document
fields = ["title","labels"]
def upload_document(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
new_document = form.save()
return HttpResponseRedirect("/thanks/")
else:
form = DocumentForm()
return render_to_response('upload_page.html', {'form':form}, context_instance=RequestContext(request))
Al cargar un documento, que se agrega a la base de datos, sin embargo no hay etiquetas están siendo creado o asociado con el documento. ¿Debo agregar algo explícitamente a la función save() del documento para que esto suceda? ¿O en algún lugar del archivo Views.py? Me imagino que iría algo como:
- Compruebe si la etiqueta que se está agregando ya existe
- Si no es así, a continuación, crear una nueva etiqueta
- Grab tanto el actual id_documento y el nuevo/label_id existente
- Añadir un registro a la tabla document_labels (creado automáticamente para la relación muchos-a-muchos)
me siento como que es una funcionalidad bastante estándar que asumí sería construida en a am relación de cualquiera a muchos en django, pero parece que no funciona para mí hasta ahora. Estoy tratando de evitar reinventar la rueda aquí. Algo nuevo para django.
¡Gracias de antemano!
¿Está utilizando un formulario? ¿Está agregando 'Document's por otros medios? ¿De qué método save() estás hablando? ¿El de 'Documento', 'Etiqueta' o un formulario? Proporcione alguna vista de muestra/formulario/otro código que guarde el objeto. – andreaspelme
Supongo que no estoy muy seguro de qué método de guardado debe ir. De ahí que mi pregunta =] los documentos se estén agregando todos a través de un Formulario en el sitio. He actualizado la pregunta para incluir ese código desde views.py –