Django Rest Framework在创建Django用户时创建用户配置文件

时间:2018-07-01 07:15:41

标签: django

我的CABSERVICE应用程序具有以下模型:

from django.db import models
from django.contrib.auth.models import User

# Create your models here.


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone_number = models.CharField(max_length=10)
    is_rider = models.BooleanField(default=False)
    is_driver = models.BooleanField(default=False)

class Rider(models.Model):
    user = models.OneToOneField(UserProfile, on_delete=models.CASCADE)

class Driver(models.Model):
    user = models.OneToOneField(UserProfile, on_delete=models.CASCADE)
    cab = models.OneToOneField('Cab', on_delete=models.CASCADE)

class Cab(models.Model):
    color = models.CharField(max_length=20)
    rn = models.CharField(max_length=20)
    available = models.BooleanField(default=True)
    model = models.CharField(max_length=50)

class Booking(models.Model):
    rider = models.ForeignKey(Rider, on_delete=models.SET_NULL, null=True)
    driver = models.ForeignKey(Driver, on_delete=models.SET_NULL, null=True)
    fare = models.IntegerField()
    src = models.CharField(max_length=100)
    dest = models.CharField(max_length=100)
    duration = models.DurationField()

Serializers.py

from django.contrib.auth.models import User
from ca
from rest_framework import serializers

class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = UserProfile

class RiderSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Rider

class DriverSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Driver


class CabSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Cab

class UserSerializer(serializers.HyperlinkedModelSerializer):
    profile = UserProfileSerializer()
    #cab = CabSerializer()
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'profile')
        extra_kwargs = {
            'password': {'write_only': True},
        }

        def create(self, validated_data):
            user = User.objects.create_user(
                username = validated_data['username'],
                password = validate_data['password'],
                email = validate_data['email'])
            profile = validate_data['profile']
            user_profile = UserProfile.objects.create(user = user, **profile)
            if profile['is_rider']:
                Rider.objects.create(user = user_profile)
            #else if profile['is_driver']:
            #    cab = validate_data['cab']
            #    Driver.objects.create(user = user, cab=cab)
            return user

我要创建一个具有以下端点的api:

/ drivers / --GET显示所有用户--POST添加新驱动程序

/ riders / --GET显示所有骑手--POST添加新骑手

/ cabs / --GET显示所有出租车–POST添加新出租车

我读到django应用程序应仅具有一个用户身份验证模型,因此我对其进行了扩展,以使骑手和驾驶员引用用户配置文件。

注意:驱动程序模型具有与cab模型的映射。

请帮助我使用django rest框架实现这种api结构。

1 个答案:

答案 0 :(得分:0)

也许更好的方法是拥有一个用户模型,并在模型中添加一个“角色”属性,以表明该用户是驾驶员还是骑手。

在这种情况下,您不需要单独的模型,这可能只会给您带来麻烦-如果您必须通过id(是驱动程序/驾驶员的ID?等)来选择用户,就会遇到麻烦

类似这样的东西:

class MyUser(AbstractUser):
     ROLE_CHOICES = (
         ('R', 'rider'),
         ('D', 'driver'),
    )
    role = models.CharField(max_length=1, choices=ROLE_CHOICES)

对于您的视图,您可以创建一个视图来注册用户并根据端点对其进行专门化。像这样:

class RegisterView(generics.CreateAPIView):
   role = None
   def perform_create(self, serializer):
        serializer.save(role=role)

在您的urls.py中:

urlpatterns = [
    url(r'^drivers/', RegistrationView.as_view(role='driver'), name="driver_register"),
    url(r'^riders/', RegistrationView.as_view(role='rider'), name="rider_register"),
]

此时,您可能需要或不需要用户配置文件,因为您可以将用户配置文件信息直接添加到用户模型中。

根据您选择是否拥有用户个人资料,您可以实现序列化程序(该序列化程序将只是一个,而不是多个)

当然,您需要告诉django使用您的模型而不是django的用户模型。但这很容易,只需检查文档即可。