Django- как я могу получить выборки поля "многие-ко-многим" в таблице моей модели?
У меня есть модель django (MyModel), где одно из полей (tags) является полем ManyToManyField - значением тега на самом деле является другая модель (Tag). Когда пользователь создает экземпляр/запись MyModel в панели администратора Django, он выбирает по крайней мере один тег из списка тегов для этой записи
bytes/models.py
class Tag(models.Model):
CATEGORY_CHOICES = (
('topic', 'topic')
)
tag = models.CharField(max_length=100, unique=True)
category = models.CharField(max_length=100, choices=CATEGORY_CHOICES)
class MyModel(models.Model):
id = models.CharField(max_length=30, primary_key=True)
title = models.CharField(max_length=300, default='')
author = models.CharField(max_length=300)
copy = models.TextField(blank=True, default='')
tags = models.ManyToManyField(Tag)
Я пытаюсь написать пользовательскую задачу управления Django, где я использую SQL для получения всех данных из MyModel (на сервере PSQL):
import psycopg2
class Command(BaseCommand):
def handle(self, *args, **options):
config = settings.DATABASES['default']
try:
query = F'''SELECT * from bytes_mymodel'''
conn = psycopg2.connect(..use config to connect to server)
cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()
print(results)
Однако, когда я печатаю "результаты", я получаю список кортежей - каждый кортеж является экземпляром/входом MyModel. Однако я не вижу, какие теги выбраны для записи tags каждого экземпляра MyModel. Например:
[('abc', 'The Title Here', 'Written By', 'Lots of copy'), ('efg', 'The Second Title Here', 'Written By', 'Lots of copy')]
Как я могу получить выборки tags для каждой записи MyModel через задачу управления Django? Должен ли я использовать что-то другое, кроме SQL? (может быть, Django ORM?)
Кстати, если бы я использовал встроенную в Django задачу управления dumpdata, я бы получил теги, которые были выбраны (в виде массива с номерами, которые соответствуют тегу). Например:
./manage.py dumpdata bytes.mymodel --indent 4 > static/bytes.json
выходы:
"fields": {
"id": "abc"
"title": "The Title Here"
"author": "Written By"
"copy": "Lots of copy"
"tags": [3,5]
}
Полагаю, вопрос в том, что вы собираетесь делать с данными после?
Для одного экземпляра из метода модели, например, вы можете сделать self.tag_set.all() (или заменить tag_set тем, что related_name установлено в ManyToManyField для тегов.
Есть также values_list(), который кажется лучшим решением для получения всех связей MyModel и Tag, даже пустых и нескольких на экземпляр.
MyModel.objects.values_list('id', 'title', 'author', 'copy', 'tags__tag')