Django Rest框架:带序列化程序的ForeignKey
我有两张带外键的简单桌子。我想用foreignkey检索表中的数据:Django Rest框架:带序列化程序的ForeignKey,django,rest,django-rest-framework,Django,Rest,Django Rest Framework,我有两张带外键的简单桌子。我想用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(1
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;
因此,我在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)
在DRF中,我使用的序列化程序如下:
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')
class ReminderTypeSerializer(serializers.ModelSerializer):
reminder = ReminderSerializer(read_only=True)
id = serializers.IntegerField(read_only=True)
name = serializers.CharField()
最后,我的视图集:
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']
当我反转对序列化程序的调用时,如下所示:
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')
class ReminderTypeSerializer(serializers.ModelSerializer):
reminder = ReminderSerializer(read_only=True)
id = serializers.IntegerField(read_only=True)
name = serializers.CharField()
我有这些数据,但这些关系对我来说毫无意义(提醒类型):
我测试了一些其他关系(嵌套、相关等),但没有成功
你能帮我吗?
谢谢
F.您已经为提醒字段设置了
相关的
,因此在序列化程序中应该是提醒类型=提醒类型序列化程序(read\u only=True,many=True)
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')
或者rementerTypes=rementerTypeSerializer(只读=True,source='empturesType')
:
如果需要获取提醒序列化程序
的所有相关提醒类型,则应在序列化程序中使用相关的\u名称
注意:添加
many=True
以序列化对象列表。您已经为提醒字段设置了相关的\u name='membersType'
,因此在序列化程序中它应该是提醒类型=提醒类型序列化程序(read_only=True,many=True)
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')
或者rementerTypes=rementerTypeSerializer(只读=True,source='empturesType')
:
如果需要获取提醒序列化程序
的所有相关提醒类型,则应在序列化程序中使用相关的\u名称
注意添加
many=True
来序列化对象列表。我真的很困惑。有提醒类型,有提醒类型和提醒类型。你能解释一下哪个是哪个吗?@cezar哦,非常感谢!我没有注意到提醒类型中的s
。也谢谢!现在它是可以理解和理解的。我真的很困惑。有提醒类型,有提醒类型和提醒类型。你能解释一下哪个是哪个吗?@cezar哦,非常感谢!我没有注意到提醒类型中的s
。也谢谢!现在,它是可以理解的,是有意义的。