【问题标题】:creating models with foreingn keys using django Rest framework使用 django Rest 框架创建具有外键的模型
【发布时间】: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


【解决方案1】:

所以我的系统上有不同类型的用户(父母和 孩子们)。我正在使用与用户模型的关系来实现它们 因为父母和孩子有不同的领域。 (补充:有没有 有更好的方法吗?)

我宁愿使用逆向方法。

Person
   Profile
   Contact
   Graduation

ParentChildRelationship
   Parent (Person)
   Child (Person)

但我想这是一个品味问题。

所以 /api/parents 中的帖子会创建一个新的 Parent 对象。但它不会 创建父模型所需的用户对象。单程 是对 /api/users/ 进行 2 次 api 调用并创建新用户和 然后获取新用户的 id 并使用它来发布到 /api/parents。我会 喜欢避免这种情况。创建新的时有没有办法做到这一点 来自 api 的父级。

通过 REST,您始终可以根据需要创建新资源。例如,如果您想同时创建资源 A 和 B,那么您可以定义一个名为 C 的资源,它可以同时创建这两个资源。阅读也一样。

在您当前的情况下,您不必定义新资源。用户是父母和孩子的嵌入式资源。因此,您还必须发送一个包含该嵌入式资源的表示。通常采用纯 JSON 格式的 {user: {}}。您可能无法使用当前工具解决这些问题。由于我对 django 和 python 一无所知,所以我无法提供更多帮助。

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多