Python 使用django Rest框架创建带有foreingn键的模型
我有以下型号Python 使用django Rest框架创建带有foreingn键的模型,python,django,api,rest,django-rest-framework,Python,Django,Api,Rest,Django Rest Framework,我有以下型号 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,
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)
因此,我的系统中有不同类型的用户(父母和孩子)。我使用与用户模型的关系来实现它们,因为父母和孩子有不同的字段。(额外:有更好的方法吗?)
我还在RESTAPI中实现了这些模型的序列化
序列化程序.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
并设置URL
url.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中的post将创建一个新的父对象,但它不会创建父模型所必需的用户对象。一种方法是对/api/users/a post进行两次api调用,创建新用户,然后获取新用户的id,并使用它向/api/parents进行post。我想避免这种情况。当从api中创建新父级时,是否有一种方法可以做到这一点。如何在parents列表视图(api/parents/)中返回用户的名字和姓氏。现在它只返回相关用户的url,而不返回其字段
因此,我的系统上有不同类型的用户(父母和
儿童)。我使用与用户模型的关系来实现它们
因为父母和孩子有不同的领域。(额外:有吗
有更好的方法吗?)
我宁愿使用相反的方法
Person
Profile
Contact
Graduation
ParentChildRelationship
Parent (Person)
Child (Person)
但我想这是品味的问题
因此/api/parents中的一个post将创建一个新的父对象,但它不会
创建父模型所需的用户对象。单程
是对/api/users/a post进行两次api调用,并创建新的用户和
然后获取新用户的id并使用它发布到/api/parents。我会的
我想避免这种情况。在创建新项目时,有没有办法做到这一点
来自api内的父级
通过REST,您始终可以为任何目的创建新资源。例如,如果您想同时创建资源A和B,那么您可以定义一个名为C的资源,它可以同时创建这两个资源。读书也一样
在当前情况下,不必定义新资源。用户是父级和子级的嵌入式资源。因此,您必须发送一个包含嵌入资源的表示。通常为纯JSON格式的
{user:{}}
。您可能无法用当前的工具解决这些问题。因为我对django和python一无所知,所以我无法提供更多帮助。Imho用户应该有联系人和毕业详细信息。我想不是每个孩子都有父母S应在不同的表imho中维护这些关系。但目前的解决方案可能已经足够了。。。