Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Rest框架:带序列化程序的ForeignKey_Django_Rest_Django Rest Framework - Fatal编程技术网

Django Rest框架:带序列化程序的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

我有两张带外键的简单桌子。我想用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;
因此,我在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
。也谢谢!现在,它是可以理解的,是有意义的。