我的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结构。
答案 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的用户模型。但这很容易,只需检查文档即可。