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.