Попытка выполнить INNER Join и отобразить результат в API

Этот вопрос задавался раньше, но я не могу использовать ни один из ответов на свой случай.

Я пытаюсь получить эквивалент этого, чтобы показать результаты в API.

SELECT denom_name,retail_name,retail_adr 
FROM denomination d INNER JOIN Retailer r 
ON r.id = d.retailer.id

Это мои модели (models.py):

class Retailer(models.Model):
    retail_name = models.CharField(max_length=30)
    retail_addr = models.CharField(max_length=300,null=True)
    def __str__(self):
        return self.retail_name

class Denomination(models.Model):
    denom_name = models.CharField(max_length=1000)
    retailer = models.ForeignKey(Retailer, on_delete=models.CASCADE)

Я создал набор представлений в views.py

class DenomRetailViewset(viewsets.ModelViewSet):

    queryset = Denomination.objects.select_related('Retailer')
    serializer_class =  DenomRetailSerializer  

Но здесь кроется проблема, по крайней мере, одна из них.

Я создаю сериализатор через serializer.py

class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model= retailer,denomination
        fields = ('denom_name','retail_name','retail_adr')

Но, как видите, сериализатор не может принять две модели. Кроме того, у меня есть сомнения по поводу представления, queryset = Denomination.objects.select_related('Retailer').

Любые советы более чем приветствуются, так как я начинаю терять рассудок.

Спасибо.


person Andy K    schedule 15.07.2020    source источник
comment
Использовать get_queryset(..) вместо этого?   -  person thebjorn    schedule 15.07.2020
comment
Если Retailer должен существовать (как подразумевается inner join), вы захотите изменить свой queryset на queryset = Denomination.objects.select_related('Retailer').filter(retailer__isnull=False)   -  person Ross Rogers    schedule 15.07.2020


Ответы (2)



В этом случае вы можете использовать глубину:

class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model= denomination
        fields = ('denom_name','retail')
        depth = 1

Ответ вернет внутреннее соединение следующим образом:

{
    "id": 1,
    "denom_name ": "...",
    "retail": {
        "id" : 1,
        "retail_name" : "...",
        "retail_addr" : "..."
    }
}

person Phuc Nguyen    schedule 16.07.2020