Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
302 views
in Technique[技术] by (71.8m points)

Override Django (DRF) Serializer object GET

I'm trying to "inject" some raw sql into my DRF nested Serializer:

# SERIALIZERS

class CarSerializer(serializers.ModelSerializer):

    class Meta:
        model = Car
        fields = '__all__'

class DriverSerializer(serializers.ModelSerializer):
    car = CarSerializer()   # <--- here I don't want to get the Car object but rather inject a raw sql.

    class Meta:
        model = Driver
        fields = '__all__'

The SQL injection is needed to request for a specific version of the data since I'm using MariaDB versioning tables but this is not relevant. How do I override the method that gets the object from CarSerializer? Thank you.

question from:https://stackoverflow.com/questions/66063405/override-django-drf-serializer-object-get

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This is untested but I think you want to override the __init__ in DriverSerializer and then load the result of your raw SQL via data, something like this:

class DriverSerializer(serializers.ModelSerializer):
     [...]
     def __init__(self, *args, **kwargs):
          super(DriverSerializer, self).__init__(*args, **kwargs)
          name_map = {'column_1': 'obj_attr_1', 'column_2': 'obj_attr_1', 'pk': 'id'}
          raw = Car.objects.raw('SELECT ... FROM ...', translations=name_map)
          data = {k: getattr(raw[0], k) for k in name_map.keys()}
          self.car = CarSerializer(data=data)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...