*更新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)
答案 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