DRF序列化程序关系/ JSON API框架

时间:2017-11-16 07:52:47

标签: python django django-rest-framework

*更新1:现在在序列化代码中显示相应错误的尝试

*更新2:我已将此问题缩小为与JSON Api framework我使用

冲突的问题

我对Python和Django相当陌生,而且我在关系方面苦苦挣扎。我能够在数据库中创建关系但是我无法将模型序列化为响应对象,尽管尝试documentation中的每个方法看起来非常简单。我的目标是在登录时从APIView返回两个模型,如果此代码没有错误,我只得到用户模型的响应。错误因不同的技术而异,与其他用户在遇到关系时遇到的问题类似,但是他们的修复无法解决我的问题。

我想知道是否有明显的事情我做得不对。我很乐意分享更多代码,但我真的不知道如何继续。

Fyi:我的模型在不同的应用程序中,这就是为什么fk引用是users.User

型号:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=50, unique=True)
    password = models.CharField(max_length=100)
    name = models.CharField(max_length=50)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    has_business = models.BooleanField(default=False)

    objects = UserManager()
    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = ['password']

    def get_full_name(self):
        return self.name

    def get_short_name(self):
        return self.name

    def __str__(self):
        return self.email

class Business(models.Model):
    name = models.CharField(max_length=50, unique=True)
    address = models.CharField(max_length=100)
    phone = models.CharField(max_length=20)
    description = models.CharField(max_length=500)
    user = models.ForeignKey(
        'users.User',
        related_name='business',
        unique=False,
        on_delete=models.CASCADE
        )
    has_driver = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)

串行:

class UserSerializer(serializers.ModelSerializer):

    token = srs.SerializerMethodField()

biz = BusinessSerializer(many=True, read_only=True, 
source='business.id')
error: just returns user model

biz = BusinessSerializer(read_only=True, many=True, source='business')
error: ForeignKey' object has no attribute

biz = serializers.RelatedField(many=True, read_only=True)
error: 'User' object has no attribute 'biz'

biz = serializers.ReadOnlyField(source='businesses.id')
error: RelatedManager object at 0x7fed496fe208> is not JSON 
serializable

biz = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
error:'User' object has no attribute 'biz'

    class Meta:
        model = models.User
        fields = ('id', 'email', 'password', 'name', 'token', 'has_business', 'biz')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):

        user = models.User(
                email = validated_data['email'],
                name = validated_data['name'],
                phone = validated_data['phone'],
                location = validated_data['location'],
            )
        user.set_password(validated_data['password'])
        user.save()

        return user

查看:

class LoginUser(APIView):
    permission_classes = (permissions.AllowAny,)
    resource_name = 'users'

    def post(self, request):
        email = request.POST.get('email', False)
        password = request.POST.get('password', False)

        if(email and password):

            lu = UserAuth()
            authenticated_user = lu.auth(email=email, password=password) 

            if authenticated_user is not None:
                if authenticated_user.is_active:

                    serializer = serializers.UserSerializer(authenticated_user, context={'request': request})
                    return Response(serializer.data, status=status.HTTP_200_OK)

2 个答案:

答案 0 :(得分:0)

您必须在序列化程序中使用related_name。

您可以查看here

在此示例中,您可以看到跟踪模型(与您的业务模型类似)具有名为album的字段,其中related_name ='tracks'

然后在AlbumSerializer中(与用户模型类似):

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.StringRelatedField(many=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

因此,总而言之,您必须使用您的related_name business

这是使用StringRelatedField的示例,但您当然可以使用this

返回整个对象

答案 1 :(得分:0)

原来我正在使用JSON API Framework的测试版(pip install djangorestframework-jsonapi == 2.0.0-beta.1)并且它没有很好地处理关系。我选择了测试版,因为它是文档列表中的一个有点奇怪的。你必须为更稳定的版本挖掘一下。我很尴尬地说我花了多长时间才弄明白。

以下是截至今日的稳定版:pip install djangorestframework-jsonapi == 2.2.0