Попытка добавить данные в базу данных Postgresql с помощью psycopg2
Я смог создать скрипт для добавления данных прямо в таблицу Postgresql. Единственная проблема - это ManyToManyFields. Хотя я могу добавить данные, я не могу связать их с ManyToMany.
Вот мой 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('Business Name', max_length=250)
address = models.CharField('Address', max_length=300)
phone_number = models.CharField('Phone Number', max_length=20)
web = models.URLField('Website')
category = models.ManyToManyField(Category)
main_image = models.CharField('Image Link', max_length=500)
LISTING_STATUS = (
('a', 'Active'),
('e', 'Expired'),
('i', 'Inactive'),
('c', 'Claimed'),
)
status = models.CharField(
max_length=1,
choices=LISTING_STATUS,
blank=True,
default='a',
help_text='Listing Status',
)
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)])
В другом файле я создал другой код для добавления информации в базу данных:
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()
Я знаю, что могу вручную связать элементы, если я использую Django shell
. Но есть ли способ добавить listing
и связать его с соответствующим category
?
Заранее спасибо.
Вместо этого вам следует использовать ORM от Django:
def insert(name, address, phone_number, web, status, main_image):
Listing.objects.create(
name=name,
address=address,
phone_number=phone_number,
website=web,
status=status,
main_image=main_image,
)
Я не уверен, как вы определяете, какие категории относятся к данному листингу, но процесс связывания категории и листинга тривиален:
listing = Listing.objects.create(...)
category = Category.objects.first()
listing.categories.add(category)