Как получить доступ к другому столбцу из связанной таблицы, кроме внешнего ключа, при создании представления API

Я использую django для веб-приложения и создаю представления REST API. Есть ли способ получить доступ к двум таблицам в одном представлении? Если нет, то как я могу получить столбец с неиностранным ключом из связанной записи. Приведенный ниже код извлекает запись о вазе на основе параметра URL. Я хочу получить доступ к artistName, которое хранится в таблице artist (один ко многим с таблицей Vase), а не к artist_id, который хранится в Vase

class FilterVases(generics.ListAPIView):
    serializer_class = VaseSerializer 
    def get_queryset(self):
        queryset = Vase.objects.all()
        artist_id = self.request.query_params.get('artist_id')
        if artist_id is not None:
            queryset = queryset.filter(artist_id=artist_id)
        vaseID = self.request.query_params.get('vaseID')
        if vaseID is not None:
            queryset = queryset.filter(vaseID=vaseID)
        return queryset 

В модели Vase добавьте следующее:

def artist_name(self):
        return self.artist.artistName

Следовательно, это будет выглядеть следующим образом:

class Vase(models.Model):
        vaseID = models.CharField(max_length=10) 
        vaseRef = models.CharField(max_length=255,blank=True,null=True)
        inscription = models.CharField(max_length=255,blank=True,null=True)
        fabric = models.CharField(max_length=100, blank=True,null=True)
        subject = models.CharField(max_length=255,blank=True,null=True)
        technique = models.CharField(max_length=100,blank=True,null=True)
        height = models.FloatField(max_length=100,blank=True,null=True)
        diameter = models.FloatField(max_length=100,blank=True,null=True) 
        shape = models.ForeignKey(Shape, on_delete=models.CASCADE)
        artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
        provenance = models.ForeignKey(Provenance, on_delete=models.CASCADE)
        collection = models.ForeignKey(Collection, on_delete=models.CASCADE)

        def artist_name(self):
            return self.artist.artistName

В VaseSerializer добавьте 'artist_name' в поля Meta.

Если вы хотите добавить эти пользовательские поля ко всем полям модели Vase, обратитесь к этой теме Django Rest framework, как включить поля '__all__' и связанное поле в ModelSerializer

class VaseSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Vase
        fields = '__all__'
        extra_fields = ['artist_name']

    def get_field_names(self, declared_fields, info):
        expanded_fields = super(VaseSerializer, self).get_field_names(
            declared_fields, info)

        if getattr(self.Meta, 'extra_fields', None):
            return expanded_fields + self.Meta.extra_fields
        else:
            return expanded_fields

Ниже приведено ваше мнение:

class FilterVases(generics.ListAPIView):
    serializer_class = VaseSerializer 
    def get_queryset(self):
        queryset = Vase.objects.all()
        query_artist = self.request.query_params.get('artist_name')
        if query_artist is not None:
            try:
                artist = Artist.objects.get(artistName=query_artist)
                queryset = queryset.filter(artist=artist)
            except:
                pass
        vaseID = self.request.query_params.get('vaseID')
        if vaseID is not None:
            queryset = queryset.filter(vaseID=vaseID)
        return queryset 
Вернуться на верх