Intentando agregar datos a una base de datos de Postgresql usando psycopg2
Pude crear el script para agregar datos directamente en la tabla de Postgresql. El único problema son los ManyToManyFields. Aunque puedo agregar los datos, no puedo enlazarlos a los de ManyToMany.
Aquí está mi models.py
:
class Category(MPTTModel):
name = models.CharField(max_length=150, unique=True)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
class MPTTMeta:
order_insertion_by = ['name']
def __str__(self):
return self.name
from django.urls import reverse
class Listing(models.Model):
name = models.CharField('Nombre del Negocio', max_length=250)
address = models.CharField('Dirección', max_length=300)
phone_number = models.CharField('Número de Teléfono', max_length=20)
web = models.URLField('Sitio Web')
category = models.ManyToManyField(Category)
main_image = models.CharField('Enlace de la Imagen', max_length=500)
LISTING_STATUS = (
('a', 'Activo'),
('e', 'Expirado'),
('i', 'Inactivo'),
('c', 'Reclamado'),
)
status = models.CharField(
max_length=1,
choices=LISTING_STATUS,
blank=True,
default='a',
help_text='Estado del Listado',
)
def get_cats(self):
return ", ".join([str(p) for p in self.category.all()])
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('listing-detail', args=[str(self.id)])
En otro archivo, creé otro código para agregar información a la base de datos:
def insert(name, address, phone_number, web, status, main_image):
conn = psycopg2.connect("host=localhost dbname=augustalife user=postgres")
cur = conn.cursor()
cur.execute("INSERT INTO listings_listing (name, address, phone_number, web, status, main_image) VALUES (%s,%s,%s,%s,%s,%s);", (name, address, phone_number, web, status, main_image))
conn.commit()
conn.close()
Sé que puedo enlazar manualmente elementos si estoy usando Django shell
. Pero, ¿hay alguna manera de agregar un listing
y conectarlo con la categoría adecuada?
Gracias de antemano.
davy.ai
Sí, para agregar un
listado
y conectarlo con lacategoría
correspondiente, puedes modificar tu funcióninsert()
para incluir la relación ManyToMany. Aquí tienes un ejemplo:En este ejemplo, puedes pasar una lista de nombres de categoría como parámetro adicional a la función
insert()
. La función luego recupera la clave primaria del listado recién insertado usandoSELECT lastval()
, recupera los objetos de categoría coincidentes basados en sus nombres usandoCategory.objects.filter()
, y agrega las categorías al campo ManyToMany del listado usandolisting.category.add()
.