【发布时间】:2017-08-07 00:58:06
【问题描述】:
我在 Bcustomer 应用程序中有一个客户模型,它扩展了 django User 模型,所以我将保存基本详细信息,例如用户表中的名称和客户表中的剩余数据(城市等)。
当我通过 API 调用以下代码时,它显示以下错误。但是数据保存在表中。我还想实现这个 api 的 get 和 put 调用。
Got AttributeError when attempting to get a value for field `city` on serializer `CustomerSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'User' object has no attribute 'city'.
我的客户/models.py
class BCustomer(models.Model):
customer = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True, blank=True )
address = models.CharField(max_length=50)
city = models.CharField(max_length=256)
state = models.CharField(max_length=50)
user = models.ForeignKey(settings.AUTH_USER_MODEL, db_index=True, on_delete=models.CASCADE, related_name='customer_creator')
# more fields to go
def __str__(self):
# return str(self.name) (This should print first and last name in User model)
class Meta:
app_label = 'bcustomer'
我的 Bcustomer/serializers.py
from django.contrib.auth import get_user_model
from models import BCustomer
class CustomerSerializer(serializers.HyperlinkedModelSerializer):
city = serializers.CharField()
class Meta:
model = get_user_model()
fields = ('first_name', 'email','city')
def create(self, validated_data):
userModel = get_user_model()
email = validated_data.pop('email', None)
first_name = validated_data.pop('first_name', None)
city = validated_data.pop('city', None)
request = self.context.get('request')
creator = request.user
user = userModel.objects.create(
first_name=first_name,
email=email,
# etc ...
)
customer = BCustomer.objects.create(
customer=user,
city=city,
user=creator
# etc ...
)
return user
my Bcustomer/views.py
class CustomerViewSet(viewsets.ModelViewSet):
customer_photo_thumb = BCustomer.get_thumbnail_url
permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
queryset = BCustomer.objects.all()
serializer_class = CustomerSerializer
我的客户/urls.py
router.register(r'customer', views.CustomerViewSet, 'customers')
POST 请求格式
{
"first_name":"Jsanefvf dss",
"city":"My City",
"email":"myemail@gmail.com",
#more fields
}
我还需要为此 api 实现 put 和 get。现在数据都保存在两个表中,但显示错误。
【问题讨论】:
-
如果
CustomerSerializer应该序列化BCustomer,那为什么模型设置为get_user_model?
标签: django django-models django-rest-framework django-users django-serializer