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')

Вернуться на верх