简体   繁体   中英

Django Rest Framework : ForeignKey with Serializer

I've two simples table, with a foreignKey. I want to retreive datas in the table with the foreignkey :

CREATE TABLE `firerisk_reminder` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` longtext NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `firerisk_remindertype` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `reminder_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `firerisk_remindertyp_reminder_id_03340ffc_fk_firerisk_` (`reminder_id`),
  CONSTRAINT `firerisk_remindertyp_reminder_id_03340ffc_fk_firerisk_` FOREIGN KEY (`reminder_id`) REFERENCES `firerisk_reminder` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

And, so, my model in django :

class Reminder(models.Model):
    name = models.TextField(default='')
    report = models.OneToOneField(Report, related_name='reminder', on_delete=models.PROTECT)

    def __str__(self):
        return self.name

class ReminderType(models.Model):
    name = models.CharField(max_length=45, unique=True)
    reminder = models.ForeignKey(Reminder,related_name='reminderstype',on_delete=models.PROTECT)

In DRF, I'm using serializers like this :

class ReminderTypeSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()

    class Meta:
        model = ReminderType
        fields = ('id', 'name')
        ordering = ('name',)

class ReminderSerializer(serializers.ModelSerializer):
    remindertypes = ReminderTypeSerializer(read_only=True)
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()

    class Meta:
        model = Reminder
        ordering = ('name',)
        fields = ('id', 'name', 'remindertypes')

Finally, my ViewSets :

class ReminderTypeViewSet(viewsets.ModelViewSet):
    serializer_class = ReminderTypeSerializer
    queryset = ReminderType.objects.all().order_by('name')
    # Authentification !
    permission_classes = (IsAuthenticated,)
    # Only 'get' method
    http_method_names = ['get']

class ReminderViewSet(viewsets.ModelViewSet):
    serializer_class = ReminderSerializer
    queryset = Reminder.objects.all().order_by('name')
    # Authentification !
    permission_classes = (IsAuthenticated,)
    # Only 'get' method
    http_method_names = ['get']

When I reverse the call to serializers, like this :

class ReminderTypeSerializer(serializers.ModelSerializer):
    reminder = ReminderSerializer(read_only=True)
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()

i've the datas, but the relations has no sense for me (remindertype) :

[
    {
        "id": 1,
        "name": "yyyyyyyy",
        "reminder": {
            "id": 1,
            "name": "First report test"
        }
    },
    {
        "id": 2,
        "name": "xxxxxxxx",
        "reminder": {
            "id": 1,
            "name": "First report test"
        }
    }
]

I've tested some others relations (nested, related, etc), unsuccessfully.

Can you help me please ? Thanks F.

You've set related_name='reminderstype' for reminder field, so it should be reminderstype = ReminderTypeSerializer(read_only=True, many=True) in serializer.

class ReminderSerializer(serializers.ModelSerializer):
    reminderstype = ReminderTypeSerializer(read_only=True, many=True)
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()

    class Meta:
        model = Reminder
        ordering = ('name',)
        fields = ('id', 'name', 'reminderstype')

Or remindertypes = ReminderTypeSerializer(read_only=True, source='reminderstype') :

class ReminderSerializer(serializers.ModelSerializer):
    remindertypes = ReminderTypeSerializer(read_only=True, source='reminderstype', many=True)

You should use related_name in your serializer if you need to get all related remindertypes for ReminderSerializer .

Note add many=True to serialize list of objects.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM