Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用django Rest框架创建带有foreingn键的模型_Python_Django_Api_Rest_Django Rest Framework - Fatal编程技术网

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中维护这些关系。但目前的解决方案可能已经足够了。。。