我正在尝试为时间序列数据建立数据存储,为此,我创建了嵌套对象Coin和Data,其中Coin是父对象,并且包含每个数据条目都是单个对象的Data条目。目前,我在CoinSerializer中创建create函数时,我的代码创建了嵌套对象Coin [Data],但是我无法使用正确的方法在现有Coin对象中添加/创建子对象
在我的python虚拟环境中,我一直在使用django 2.1.4 drf 3.9和python 3.6 ..作为我项目的后端数据库引擎,我得到了mongodb并使用djongo 1.2对其进行维护
对于我提出的问题的任何想法或方法,将不胜感激,因为这是我有史以来的第一篇文章,对于任何不适当的样式,我们深表歉意。
models.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)
serializers.py
class DataSerializer(serializers.ModelSerializer):
class Meta():
model = models.Data
fields = ('coin_id','pk','id','date','open','high','low','close')
类CoinSerializer(serializers.ModelSerializer): data = 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
}
...
...
]
},
答案 0 :(得分:1)
您正在以错误的方式进行操作。您也应该为数据创建另一个端点。在那里您可以创建数据并传递父代币的ID。只有同时创建硬币和数据时,使用嵌套体系结构才有意义。在这种情况下,只需在传递硬币ID的同时使用数据端点即可创建数据
编辑:批量创建
仅介绍如何为多个Data对象实现批量创建-您将需要使用循环来实现它,因为model.objects.create()
期望单个对象具有数据。您可以使用bulk_create,但有很多警告,所以我会使用循环
答案 1 :(得分: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}]
此示例在数组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
,并且创建了Coin
。
答案 2 :(得分: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)