Запросы на соединение моделей ManyToMany на Django - PullRequest
0 голосов
/ 05 мая 2020

Мне нужно объединить все группы, в которых находятся все люди.

вот модели:

    class Person(models.Model):    
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50, blank=True, null=True)
        aka = models.CharField(max_length=50, blank=True, null=True)
        bio = models.TextField(blank=True, null=True)
        birthday = models.DateField(blank=True, null=True)
        birth_place = models.CharField(max_length=80, blank=True, null=True)
        photo = models.ImageField(blank=True, null=True)
        location = models.CharField(max_length=80, blank=True, null=True)
        gender_choices = [
            ('m', 'Male'),
            ('f', 'Female'),
            ('u', 'Unknown'),
        ]
        gender = models.CharField(max_length=1 ,choices=gender_choices, default='u')

    class Band(models.Model):
        name = models.CharField(max_length=100)
        past_names = models.CharField(max_length=180 , blank=True, null=True)
        bio = models.TextField(blank=True, null=True)
        origin_country = models.CharField(max_length=30 , blank=True, null=True)
        location = models.CharField(max_length=80 , blank=True, null=True)
        formed_in = models.IntegerField(blank=True, null=True)
        genre = models.CharField(max_length=80, blank=True, null=True)
        themes = models.CharField(max_length=80, blank=True, null=True)
        members = models.ManyToManyField(Person)

Так как у одного человека может быть несколько диапазонов, а у группы может быть несколько участников, я предполагаю, что правильно создать отношение ManyToMany с моделью Person в модели Band

Конечно, создается таблица отношений, но как я использую эту таблицу в View, предполагая, что я хочу сделать запрос, подобный этому:

select
    person.*,
    band.*
    from person
    left join band_members on band_members.person_id = person.id
    left join band on band.id = band_members.band_id
order by band_person.id

Итак, в моем представлении есть запрос, в котором перечислены все лица, и более простое представление с использованием меньшего сериализатора, чтобы показать только некоторую информацию о людях:

    class PersonViewset(viewsets.ModelViewSet):
        queryset = Person.objects.all()
        serializer_class = PersonSerializer
        def list(self, request, *args, **kwargs):
            queryset = Person.objects.all()
            serializer = SinglePersonSerializer(queryset, many=True)
            return Response(serializer.data)

Окончательный результат для людей должно получиться примерно так:

{
    "id": 1,
    "first_name": "person1",
    "last_name": "last_name1",
    "aka": null,
    "photo": null
    "bands":[
      "band1",
      "band6"
     ]
},...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...