django - 发布一对多关系

标签 django one-to-many django-rest-framework

我正在尝试通过 Django REST 框架向我的 Django 模型公开 API。

我有一个对象观察。一个观察可以包含多个已观察到的事物。所以我这样表示:

class Observation(models.Model):

    photo_file = models.ImageField( upload_to=img_dir,   blank=True, null=True )
    titestamp = models.DateTimeField(blank=True, null=True)
    latitude = models.FloatField()
    longitude = models.FloatField()


class ObservedThing(models.Model):
    thing = models.ForeignKey(Thing) # the thing being observed
    observation = models.ForeignKey(Observation, related_name='observed_thing')
    value = models.FloatField()

据我了解,这是一种一对多的关系。

我现在有一个 API View :

class ObsvList(generics.ListCreateAPIView):
    """
    API endpoint that represents a list of observations.
    """
    model = Observation
    serializer_class = ObsvSerializer

以及相应的序列化器:

class ObsvSerializer(serializers.ModelSerializer):

    observed_thing = serializers.PrimaryKeyRelatedField(many=True)

    class Meta:
        model = Observation

我需要做什么才能发布检测到多个事件的观察结果?我想不明白。非常感谢。

最佳答案

(答案或多或少是从另一个similar but less clear question复制的)

要在单个 POST 中创建多个相关对象,需要可写的嵌套序列化程序,但目前尚不可用。

全力支持是work in progress ,但同时一个(hacky)解决方案是覆盖 create每种情况下 View 中的方法:

class FooListCreateView(ListCreateAPIView):
    model = Foo
    serializer_class = FooSerializer

    def create(self, request, *args, **kwargs):
        data=request.DATA

        f = Foo.objects.create()

        # ... create nested objects from request data ...  

        # ...
        return Response(serializer.data, 
                        status=status.HTTP_201_CREATED,
                        headers=headers)

可能并不理想,但它对我有用,直到出现正确的方法。

另一个选项是创建相关的 Observation具有单独 POST 的单独对象,并使用 PrimaryKeyRelatedField or HyperlinkedRelatedField使协会进入决赛ObservedThing邮政。

关于django - 发布一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15202924/

相关文章:

python - 如何获取按字段键入的模型对象的字典

django - 停用用户访问权限或删除它?

python - 应该多久使用一次 Python 装饰器?

MySQL:跨多对多和一对多(以及其他东西)进行计数

mysql - 在MySql中一对多关系的情况下,如何根据同一行其他列的值获取一列的值

python - Django Rest Framework 列表和详细 View 重叠

python - 动态 html 使用 django 应用程序中 JSON 链接的数据选择下拉列表

javascript - ExtJS 6 : load nested data by creating new instance of model

python - 使用特定 IP 的 Django REST 客户端测试

python - 如何在 django_admin_log 中启用 django rest api CRUD 操作的日志记录?