Django) Как связать модели urls-views-models в отношениях ManyToMany, OneToMany - PullRequest
0 голосов
/ 30 апреля 2019

Я сделал несколько моделей, которые имеют отношения ManyToMany, OneToMany, а затем я попытался создать соответствующий класс в views.py, чтобы можно было видеть подмодели, связанные с выбранной моделью.

Но с точки зренияподключая модели-сериализаторы-представления-URL, я просто не мог понять, как заставить это работать ...

Итак, я хочу сделать следующее: (упрощенно) Есть 3 модели.

  1. Вечеринка
  2. Люди
  3. Еда

스크린샷, 2019-04-30 13-41-40

Так что Party имеет отношения ManyToMany с Peopleи отношения OneToMany с Food.Когда я достиг URL-адреса, например /party_id/people_id, я хочу получить информацию о конкретном человеке из данного идентификатора участника.

Вот мой код.

models.py

class Party(models.Model):
    par_id = models.TextField()
    par_people = models.ManyToManyField(People)

class People(models.Model):
    peo_id = models.TextField()
    peo_name = models.TextField()
    peo_type = models.TextField()

class Food(models.Model):
    foo_id = models.TextField()
    foo_party = models.ForeignKey(Party, on_delete=models.CASCADE)

serializers.py

class PartySerializer(serializers.ModelSerializer):
    class Meta:
        model = Party
        fields = ('par_id', 'par_people')
# People, Food has same structure...

views.py

class PartyList(generics.ListAPIView):
    queryset = Party.objects.all()
    serializer_class = PartySerializer
# People, Food has same structure...

urls.py

Вот часть, где я заблудился

#redundancy reduced...(e.g. import)
urlpatterns = [
    path('party/<int:par_id>/<int:peo_id>', views.PartyList.as_view()),
    path('party/<int:par_id>/<int:foo_id>', views.PartyList.as_view()),
]

Итак, если я достигну website/party/1/3, я хочу увидеть информацию о человеке (чей peo_id равен 3) партии (чей par_id равен 1) .Что касается еды, все идет так же.

Должен ли я создать новый класс в views.py, чтобы он работал?Но как можно одновременно проверить par_id и foo_id, если я использую класс представления PartyList ..?Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 30 апреля 2019

Я думаю, что-то вроде этого должно работать.Основной принцип, если сработает, если использовать peo_id или foo_id, а затем отфильтровать набор запросов на этой основе.

def get (self, *args, **kwargs):
    id = kwargs.get(peo_id, None)
    if id:
        self.queryset.filter(par_people__peo_id=id)
    else:
        id = kwargs.get(foo_id, None)
        self.queryset.filter(foo_party=id)
...