Как получить те записи, у которых внешний ключ связан с другим точным внешним ключом?
Я создаю API с помощью django & django rest framework и застрял на написании одного представления. Смотрите код ниже:
models.py
class Order(models.Model):
name = models.CharField(max_length=255)
posted_by = models.ForeignKey(User, on_delete=models.CASCADE)
class Offer(models.Model):
order_related = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='offers')
author = models.ForeignKey(User, on_delete=models.CASCADE)
serializers.py:
class OfferSerializer(serializers.ModelSerializer):
class Meta:
model = Offer
fields = '__all__'
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = '__all__'
Теперь мне нужно представление, которое возвращает те заказы, в которых есть предложения, в которых автор = int:pk. Например.
GET /orders/3
должен отдать все заказы, в которых есть предложения с автором = 3
plz help me - I can write it with raw SQL but have no idea how to do it through ORM
В этом случае вы можете просто использовать pre_fecthes, используя select_related
offer = Offer.objects.filter(author__id=pk).select_related('order_related')
orders = offer.order_related
Или вы можете использовать get, но лично я этого не делаю, так как оператор get ломает код, когда данные не найдены, а filter возвращает пустой массив или набор запросов, когда данных нет, и не ломает код
offer = Offer.objects.get(author__id=pk).select_related('order_related')
orders = offer.order_related
Благодаря Джошуа Эдварду я получил в результате следующее:
views.py
class GetWorksByAuthor(ListModelMixin, GenericAPIView):
serializer_class = OfferSerializer
def get_queryset(self):
author = self.kwargs['author']
return Offer.objects.filter(author__id=author).select_related('order_related')
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
urls.py
urlpatterns = [
path('works/author/<int:author>/',views.GetWorksByAuthor.as_view()),
]