Получение несвязанных объектов в Django REST Framework - PullRequest
0 голосов
/ 21 января 2020

Моя модель состоит из 3 классов: Предложение, Заявка и Контракт. Отношения таковы:

Заявка на предложение: один на один

Заявка на контракт: один на один

Код модели выглядит следующим образом:

class Application(models.Model):
   application_name = models.CharField(max_length=255)

class Offer(models.Model):
   offer_name = models.CharField(max_length=255)
   application = models.OneToOneField(Application)

class Contract(models.Model):
   contract_name = models.CharField(max_length=255)
   application = models.OneToOneField(Application)

Могу ли я получить доступ к Договору из Оферты через Приложение в одном вызове REST? Я знаю, как получить доступ к приложению из предложения, поскольку они связаны между собой. Обойти это можно, связав предложение с контрактом, но я бы предпочел не делать этого, потому что это не будет считаться хорошим дизайном реляционной базы данных.

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

1 голос
/ 21 января 2020

Вы должны добавить related_name к своим отношениям:

class Application(models.Model):
   application_name = models.CharField(max_length=255)

class Offer(models.Model):
   offer_name = models.CharField(max_length=255)
   application = models.OneToOneField(Application, related_name='offer')

class Contract(models.Model):
   contract_name = models.CharField(max_length=255)
   application = models.OneToOneField(Application, related_name='contract')

Ваш URL должен выглядеть следующим образом:

path('offer/<int:pk>/contract/', ContractDetailView.as_view(), name='contract-detail'),
from rest_framework import exceptions
from rest_framework.generics import RetrieveAPIView


class ContractDetailView(RetrieveAPIView):
    serializer_class = ContractSerializer
    ...

    def get_object(self):
        try:
            offer = Offer.objects.get(pk=self.kwargs['pk'])
            return offer.application.contract
        except Offer.DoesNotExist:
            raise exceptions.NotFound('Offer not found.')
...