2

我正在尝试为时间序列数据构建数据存储,为此我创建了嵌套对象 Coin 和 Data,其中 Coin 是父对象并包含每个数据条目是单个对象的数据条目。此刻,我的代码在 CoinSerializer 中构建创建函数时创建了嵌套对象 Coin[Data],但我无法使用正确的方法在现有 Coin 对象中添加/创建子对象

在我的 python 虚拟环境中,我一直在使用 django 2.1.4 drf 3.9 和 python 3.6 .. 也作为我项目的后端数据库引擎,我得到了 mongodb 并使用 djongo 1.2 来维护它

任何针对我的问题提出的想法或方法将不胜感激,因为这是我的第一篇文章,对任何不恰当的风格表示抱歉。

模型.py

class Coin(models.Model):
    coin_name = models.CharField(max_length=100,blank=True)


class Data(models.Model):
    coin = models.ForeignKey(Coin, related_name='data', on_delete=models.CASCADE,blank=True)
    date = models.DateField(("Date"),blank=True)
    open = models.FloatField(null=True, blank=True)
    high = models.FloatField(null=True, blank=True)
    low = models.FloatField(null=True, blank=True)
    close = models.FloatField(null=True, blank=True)

    class Meta:
        unique_together = ('coin', 'date',)
        ordering = ['date']

    def __unicode__(self):
        return '%d: %d %d %d %d' % (self.date, self.open, self.high, 
self.low, self.close)

序列化程序.py

class DataSerializer(serializers.ModelSerializer):
class Meta():
    model = models.Data
    fields = ('coin_id','pk','id','date','open','high','low','close')

类 CoinSerializer(serializers.ModelSerializer): 数据 = DataSerializer(many=True)

class Meta:
    model = models.Coin
    fields = ('pk','id','coin_name', 'data')

def create(self, validated_data):

    data = validated_data.pop('data')
    coin = models.Coin.objects.create(**validated_data)
    models.Data.objects.create(coin=coin, **data[0])

    return coin

我的结果是这样的

 {
    "pk": 101,
    "id": 101,
    "coin_name": "ripple",
    "data": [
        {
            "coin_id": 101,
            "pk": 56,
            "id": 56,
            "date": "2016-12-25",
            "open": 4036.0,
            "high": 4101.0,
            "low": 3983.0,
            "close": 4065.0
        }
    ]
     },

and expect to consist lots of data objects which I will add by the time in existing coin object

 {
    "pk": 101,
    "id": 101,
    "coin_name": "ripple",
    "data": [
        {
            "coin_id": 101,
            "pk": 56,
            "id": 56,
            "date": "2016-12-25",
            "open": 4036.0,
            "high": 4101.0,
            "low": 3983.0,
            "close": 4065.0
        }
        {
            "coin_id": 102,
            "pk": 57,
            "id": 57,
            "date": "2016-12-26",
            "open": 4065.0,
            "high": 4189.0,
            "low": 3967.0,
            "close": 4075.0
        }
        ...
        ...
    ]
     },
4

3 回答 3

3

你的做法是错误的。相反,您也应该为 Data 创建另一个端点。在那里你可以创建数据并传递父代币的 id。仅当您同时创建硬币和数据时,使用嵌套架构才有意义。在这种情况下,只需使用数据端点创建数据,同时传递硬币的 id

编辑:批量创建

并且只是为了说明如何为多个 Data 对象实现批量创建 - 您需要使用循环来实现它,因为model.objects.create()单个对象的 excpects 数据。您可以使用bulk_create但它有很多警告,所以我会使用循环

于 2019-01-14T09:29:32.717 回答
0

尝试使用数组中的多个项目更改您的输入数据,例如:

data = [{'date': '2016-12-25', 'high': 4101.0, 'open': 0.0, 'low': 3983.0, 'close': 4065.0}, {'date': '2016-12-26', 'high': 4101.0, 'open': 0.0, 'low': 3983.0, 'close': 4065.0}]

此示例在 array 中还有一项data。并更改此行:

coin = models.Coin.objects.create(**validated_data)
models.Data.objects.create(coin=coin, **data[0])

coin = models.Coin.objects.create(**validated_data)
for item_data in data:
    models.Data.objects.create(coin=coin, **item_data)

这将创建一些Data带有 FK 的Coin创建。

于 2019-01-14T11:14:42.977 回答
0

我就是这样做的。在我的 viewset.ModelViewSet 实现中。在我的例子中。父类包含一个 manyToMany 对象的列表。我在 manyToMany 中发布新对象..> 创建它们.. 然后将 ID 重新插入到发布数据中并调用基类。工作起来很简单..我喜欢它包含在视图中。然而,我对 Django 较新。但这对我有用。


class CaseDeepViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)

    queryset = Case.objects.all().order_by('-id')

    def get_serializer_class(self):
        if self.request.method in ['GET']:
            return CaseDeepSerializer
        return CaseSerializer

    def create(self, request):
        print('IM here: ')

        print(request.data)

        case_interactions = request.data.pop('new_case_interactions')
        listCreatedInteractions = []  
        for interaction in case_interactions:
            print("interaction", interaction)
            interaction['issara_staff'] = obj = IssaraUser.objects.get(pk=interaction.get('issara_staff'))
            listCreatedInteractions.append(CaseInteraction.objects.create(**interaction).id)

        request.data['case_interactions'] = listCreatedInteractions

        return super().create(request)   


于 2020-04-14T20:00:58.720 回答