Mencoba melakukan INNER Join dan menampilkan hasilnya di API

Pertanyaan ini telah ditanyakan sebelumnya tetapi saya tidak dapat menggunakan jawaban apa pun untuk kasus saya.

Saya mencoba mendapatkan yang setara dengan ini, untuk menunjukkan hasilnya di API.

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

Ini adalah model saya (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)

Saya telah membuat kumpulan tampilan di views.py

class DenomRetailViewset(viewsets.ModelViewSet):

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

Namun di sinilah letak masalahnya, setidaknya salah satunya.

Saya membuat serializer melalui serializer.py

class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):

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

Namun seperti yang Anda lihat, serializer tidak dapat menerima dua model. Dan selain itu, saya ragu dengan tampilannya, queryset = Denomination.objects.select_related('Retailer').

Tip apa pun sangat disambut baik karena saya mulai kehilangan kewarasan.

Terima kasih.


person Andy K    schedule 15.07.2020    source sumber
comment
Gunakan get_queryset(..) saja?   -  person thebjorn    schedule 15.07.2020
comment
Jika Retailer harus ada (seperti yang tersirat oleh inner join) Anda ingin mengubah queryset Anda menjadi queryset = Denomination.objects.select_related('Retailer').filter(retailer__isnull=False)   -  person Ross Rogers    schedule 15.07.2020


Jawaban (2)



Anda dapat menggunakan kedalaman dalam hal ini:

class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):

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

Responsnya akan mengembalikan gabungan dalam seperti itu:

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

person Phuc Nguyen    schedule 16.07.2020