erondem
erondem

Reputation: 582

How to return data from two different tables in django?

I have two models in my models.py. I need to return a json response which includes data from two tables. How should my view and serializer look like?

class Device(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    device_name = models.CharField(max_length=200, null=True, blank=True )
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.device_name)

class StatusActivity(models.Model):
    OFFLINE = 1
    ONLINE = 2
    STATUS = (
        (OFFLINE, ('Offline')),
        (ONLINE, ('Online')),
    )
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    device_id = models.ForeignKey(Device, related_name='StatusActivity', on_delete=models.CASCADE)
    changed_to = models.PositiveSmallIntegerField(choices=STATUS)
    modified_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.device_id)

Expected Response:

 {
    "device_id":"",
    "device_name":"",
    "changed_to":"",
    "modified_at":"",
  }

UPDATE: I set my views.py and serializer.py as below. I am checking

Serializer.py

class DeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = '__all__'

class StatusActivitySerializer(serializers.ModelSerializer):

    class Meta:
        model = StatusActivity
        fields = '__all__'

class ListSerializer(serializers.Serializer):
    # devices = DeviceSerializer(many=True)
    # activities = StatusActivitySerializer(many=True)

    class Meta:
        model = [Device, StatusActivity]
        fields = ['device_id', 'device_name', 'changed_to', 'modified_at']

Views.py

class DeviceListView(generics.ListAPIView):
    queryset = Device.objects.all()
    serializer_class = ListSerializer

class StatusActivityListView(generics.ListAPIView):
    queryset = StatusActivity.objects.all()
    serializer_class = StatusActivitySerializer

Upvotes: 5

Views: 3396

Answers (2)

funnydman
funnydman

Reputation: 11336

Actually you don't need to have two separated views for this, because you can easily serialize relations from one serializer class. Take a look at this useful answer: How do I include related model fields using Django Rest Framework?

For your case you can write something like this:

class StatusActivitySerializer(serializers.ModelSerializer):
    device_name = serializers.CharField(source='device_id.device_name')

    class Meta:
        model = StatusActivity
        fields = ('changed_to', 'modified_at', 'device_id', 'device_name')

Something that worth to note:

  1. it's a good idea for ForeignKey field use device name instead of device_id;
  2. related_name arg should have a name for reverse access. Keep it meaningful, e.g. status_activities is a good choice.

Upvotes: 3

suhailvs
suhailvs

Reputation: 21680

filter the status activity. you can refer the foreignkey. eg:

items = []
for statusact in StatusActivity.objects.all():
    items.append({
        "device_id":statusact.device_id.id,
        "device_name":statusact.device_id.device_name,
        "changed_to":statusact.changed_to,
        "modified_at":statusact.modified_at,
    })

Upvotes: 0

Related Questions