Home > Blockchain >  How can I join two serilaizers in django rest framework that have a similar field value
How can I join two serilaizers in django rest framework that have a similar field value

Time:01-29

I have two models in my Django Restframework. In my views I want to get all properties and for each property I get Profile data of that user who created it.

How can I achieve this?

example:

#models.py
from django.contrib.auth.models import User

class Profile(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE)
     mobile = models.CharField(max_length=200)
     location = models.CharField(max_length=200)


class Properties(models.Model):
    title = models.CharField(max_length=200)
    price = models.CharField(max_length=200)
    category = models.CharField(max_length=200)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)


#serializers.py
class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'


class PropertySerializer(serializers.ModelSerializer):
    class Meta:
        model = Property
        fields = [
         'title','price','category','created_by'   
        ]


#views.py
class PropertiesView(generics.ListAPIView):
    serializer = PropertySerializer
    queryset = Property.objects.all()

CodePudding user response:

Try with :

if you want complete profile data then -

first define the related name in properties model (createby field) like -

class Profile(models.Model):
    ---
    ---

class Properties(models.Model):
    ---
  created_by = 
      models.ForeignKey(User, on_delete=models.CASCADE, related_name = "abc")

and then use related name in serializers and also include it in fields such as -

class PropertySerializer(serializers.ModelSerializer):
    abc = ProfileSerializer()
    class Meta:
        model = Property
        fields = [
         'title','price','category','created_by', 'abc'
        ]

and if you want specific profile data then -

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'


class PropertySerializer(serializers.ModelSerializer):
    mobile = serializers.SerializerMethodField()

    class Meta:
        model = Property
        fields = [
         'title','price','category','created_by', "mobile",
        ]

    def get_mobile(self, instance):
        return instance.created_by.mobile if instance.created_by else ''

CodePudding user response:

If you want to get profile data in your Properties, check below -

class PropertySerializer(serializers.ModelSerializer):
    mobile = serializers.SerializerMethodField()
    location = serializers.SerializerMethodField()

    class Meta:
        model = Property
        fields = [
         'title','price','category','created_by', "mobile", "location"
        ]

    def get_mobile(self, instance):
        return Profile.objects.get(user = instance.created_by).mobile

    def get_location(self, instance):
        return Profile.objects.get(user = instance.created_by).location
  •  Tags:  
  • Related