es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, para agregar un listado y conectarlo con la categoría correspondiente, puedes modificar tu función insert() para incluir la relación ManyToMany. Aquí tienes un ejemplo:

    def insert(name, address, phone_number, web, status, main_image, category_names):
        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))
        # Obtén la clave primaria del listado recién insertado
        cur.execute("SELECT lastval()")
        listing_id = cur.fetchone()[0]
        # Obtén los objetos de categoría coincidentes basados en sus nombres
        categories = Category.objects.filter(name__in=category_names)
        # Agrega las categorías al campo ManyToMany del listado
        listing = Listing.objects.get(pk=listing_id)
        listing.category.add(*categories)
        conn.commit()
        conn.close()
    

    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 usando SELECT lastval(), recupera los objetos de categoría coincidentes basados en sus nombres usando Category.objects.filter(), y agrega las categorías al campo ManyToMany del listado usando listing.category.add().

Comments are closed.