【发布时间】:2014-11-11 07:21:04
【问题描述】:
我有以下型号
class Parent(models.Model):
address = models.CharField(max_length=30, blank=True, null=True)
address_no = models.CharField(max_length=4, blank=True, null=True, verbose_name="No")
phone = models.CharField(max_length=15, blank=True, null=True, verbose_name="Phone Number")
user = models.OneToOneField(User)
class Meta:
verbose_name_plural = "Parents"
verbose_name = "Parent"
def __unicode__(self):
return "%s %s" % (self.user.first_name, self.user.last_name)
class Child(models.Model):
age = models.IntegerField(blank=True, null=True)
grade = models.IntegerField(blank=True, null=True)
user = models.OneToOneField(User)
parent = models.ForeignKey(Parent, related_name="children")
class Meta:
verbose_name = "Child"
verbose_name_plural = "Children"
def __unicode__(self):
return "%s %s" % (self.user.first_name, self.user.last_name)
所以我的系统上有不同类型的用户(父母和孩子)。我正在使用与用户模型的关系来实现它们,因为父母与孩子有不同的字段。 (补充:有没有更好的方法呢?)
我还在我的 rest api 中实现了这些模型的序列化
序列化器.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('id', 'url', 'username', 'email', 'groups')
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ('url', 'name')
class ParentSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Parent
class ChildSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Child
并使用视图集为 api 和功能生成视图
views.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_fields = ('username', 'email', 'first_name', 'last_name')
class GroupViewSet(viewsets.ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
class ParentViewSet(viewsets.ModelViewSet):
queryset = Parent.objects.all()
serializer_class = ParentSerializer
class ChildViewSet(viewsets.ModelViewSet):
queryset = Child.objects.all()
serializer_class = ChildSerializer
并设置网址
urls.py
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'parents', views.ParentViewSet)
router.register(r'children', views.ChildViewSet)
urlpatterns = patterns('',
# Examples:
url(r'^api/', include(router.urls)),
url(r'api-auth/', include('rest_framework.urls', namespace='rest_framework')),
)
因此 /api/parents 中的帖子会创建一个新的 Parent 对象。但它不会创建 Parent 模型所必需的用户对象。一种方法是对 /api/users/ 进行 2 次 api 调用并创建新用户,然后获取新用户的 id 并使用它来发布到 /api/parents。我想避免这种情况。从 api 中创建新父级时有没有办法做到这一点。如何在父母列表视图 (api/parents/) 中返回用户的名字和姓氏。现在它只返回相关用户的 url,但不返回其字段
【问题讨论】:
-
恕我直言,用户应该有联系方式和毕业信息。我想不是每个孩子都有父母。 :S 关系应该在不同的表中维护。但目前的解决方案可能就足够了......
标签: python django api rest django-rest-framework