django-rest-framework中可写的嵌套序列化程序?(Writable nested serializer in django-rest-framework?)
我的设计如下关于Django ModelSerializer。 有模型A和模型B.模型B有模型A的外键字段。由于某些原因,我不能直接使用主键来序列化模型B.我的想法,我需要的是序列化其他两个字段(在A型中独一无二。
我看到SlugRelatedField必须用于一个slug字段。 我搜索了一个NaturalKeyField可以支持NaturalKeyField。 但看起来它被django-rest-framework所取代。 但我检查了django-rest-framework,根本就没有这样的字段。 谁能帮忙? 我该怎么办?
代码如下。 模型A.
class AssetModel(models.Model): org = models.ForeignKey(Org, related_name='models') name = models.CharField(max_length=128) model_type = models.SmallIntegerField(default = 3,choices = MODEL_TYPE ) directory = models.CharField(max_length = 128) ... class Meta: unique_together = ('org', 'name',)
模型B.
class Dataitem(models.Model): mod = models.ForeignKey(AssetModel, related_name='dataitems') name = models.CharField(max_length=128) data_type = models.SmallIntegerField(default =0,choices = DATAITEM_DATATYPE) ...
A型串行器
class AssetModelSerializer(serializers.ModelSerializer): org = serializers.SlugRelatedField(queryset=Org.objects.all(), slug_field='name') class Meta: model = AssetModel fields = ('org', 'name', 'model_type',..
B型串行器
class DataitemSerializer(serializers.ModelSerializer): class Meta: model = Dataitem fields = ('mod', 'name','data_type'...)
模型A的主键只是Django auto添加的id。 序列化模型B时,我需要获取模型A的组织和名称。需要读取和写入。
My design is as following about Django ModelSerializer. There are model A and model B. Model B has a foreign key field of Model A. For some reasons, I can not use the primary key directly to serialize Model B. As my thought, what I need is to serialize two other fields(unique together in Model A).
And I see the SlugRelatedField must be used for one slug field. I searched there is a NaturalKeyField can support NaturalKeyField. But it looks like it is superseeded by django-rest-framework. But I checked the django-rest-framework, there is no such field at all. Can anyone help?? What should I do?
The code is as following. Model A
class AssetModel(models.Model): org = models.ForeignKey(Org, related_name='models') name = models.CharField(max_length=128) model_type = models.SmallIntegerField(default = 3,choices = MODEL_TYPE ) directory = models.CharField(max_length = 128) ... class Meta: unique_together = ('org', 'name',)
Model B
class Dataitem(models.Model): mod = models.ForeignKey(AssetModel, related_name='dataitems') name = models.CharField(max_length=128) data_type = models.SmallIntegerField(default =0,choices = DATAITEM_DATATYPE) ...
Serializer of model A
class AssetModelSerializer(serializers.ModelSerializer): org = serializers.SlugRelatedField(queryset=Org.objects.all(), slug_field='name') class Meta: model = AssetModel fields = ('org', 'name', 'model_type',..
Serializer of model B
class DataitemSerializer(serializers.ModelSerializer): class Meta: model = Dataitem fields = ('mod', 'name','data_type'...)
The primary key of Model A is just a id Django auto added. When serialize the model B, I need to get the org and name of model A. Both read and write are needed.
原文:https://stackoverflow.com/questions/34784979
最满意答案
您可以生成一系列数字,然后将该范围与所有记录交叉连接,将30天的组添加到返回的数字行。
这样的事情(没有经过测试,请原谅任何错别字): -
SELECT a.id, b.aNum, DATE_ADD(a.start_date, INTERVAL (b.aNum * 30) DAY) AS from_date, DATE_ADD(a.start_date, INTERVAL ((b.aNum + 1) * 30) DAY) AS to_date FROM sometable a CROSS JOIN ( SELECT tens.aCnt * 10 + units.aCnt AS aNum FROM (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) units CROSS JOIN (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) tens ) b WHERE DATE_ADD(a.start_date, INTERVAL (b.aNum * 30) DAY) <= end_date
此版本仅适用于最多100组30天,但可以轻松扩展(但是你应该处理的群体越多,速度会越慢)
You can generate a range of numbers, then cross join that range with all the records, adding as many groups of 30 days to that row as the number returned.
Something like this (not tested so please excuse any typos):-
SELECT a.id, b.aNum, DATE_ADD(a.start_date, INTERVAL (b.aNum * 30) DAY) AS from_date, DATE_ADD(a.start_date, INTERVAL ((b.aNum + 1) * 30) DAY) AS to_date FROM sometable a CROSS JOIN ( SELECT tens.aCnt * 10 + units.aCnt AS aNum FROM (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) units CROSS JOIN (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) tens ) b WHERE DATE_ADD(a.start_date, INTERVAL (b.aNum * 30) DAY) <= end_date
This version only works for up to 100 groups of 30 days but can easily be expanded (but will get slower the more groups you cope with)
相关问答
更多-
有什么数据库专业书籍介绍?[2022-05-19]
mysql -
您可以生成一系列数字,然后将该范围与所有记录交叉连接,将30天的组添加到返回的数字行。 这样的事情(没有经过测试,请原谅任何错别字): - SELECT a.id, b.aNum, DATE_ADD(a.start_date, INTERVAL (b.aNum * 30) DAY) AS from_date, DATE_ADD(a.start_date, INTERVAL ((b.aNum + 1) * 30) DAY) AS to_date FROM sometable a CROSS JOIN ( ...
-
MySQL没有递归功能,所以你使用NUMBERS表格技巧 - 创建一个只保存递增数字的表 - 使用auto_increment很容易: DROP TABLE IF EXISTS `example`.`numbers`; CREATE TABLE `example`.`numbers` ( `id` int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ...
-
您尝试的问题是,它会针对您的每个日期对数据库执行一次查询。 而是执行一个查询以获取具有数据的日期,然后将其与内存中的日期范围合并。 var dbData = bookings.Where(x => x.DateCreated > from && x.DateCreated < to) .GroupBy(x => x.DateCreated.Date) .ToDictionary(grp => grp.Key, grp => ...
-
我发现这样做的最好方法是简单地创建(并维护)具有单个列的辅助表,其中包含您关心的所有日期。 就像是: CREATE TABLE date_join(日期不是空主键); 然后以任何方便的方式插入每个日期的记录(手动,如果它是一次性的,作为日常过程的一部分,通过存储过程等)。 那时,它只是date_join和初始查询的左连接,使用CASE语句将NULL转换为0: SELECT dj.date, q.numar FROM date_join dj LEFT JOIN (select date(u ...
-
乔达时间很棒,但它不能直接支持你的需求,尽管它代表了你想要处理的概念 http://joda-time.sourceforge.net/quickstart.html 具体来说,请参阅http://joda-time.sourceforge.net/key_period.html 和方法.dividedBy(int)和.multipliedBy(int) Joda Time is great but it doesn't have direct support for your needs, althoug ...
-
我没有足够的声望来评论上述答案。 如果你所需要的只是数字的分割,那么你可以简单地用你的问题重新说明:“有多少条目有日期D,这样日期D-1 DAY没有条目?” 在这种情况下,您只需要这些: SELECT COUNT(*) as PeriodCount FROM `periods` WHERE DATE_ADD(`date`, INTERVAL - 1 DAY) NOT IN (SELECT `date` from `periods`); 在你的PHP中,从第一行中选择“Period ...
-
尝试使用DATE_FORMAT函数而不是使用MONTH和DAY。 请确认db中的日期是日期格式 Try DATE_FORMAT function instead of using MONTH and DAY. And please confirm that dates in db are in date format
-
要计算工时,请执行以下操作: $to_time = strtotime("$row[2]"); $from_time = strtotime("$row[3]"); $diff = $to_time - $from_time echo round(abs($diff) / 3600,2). " hour(s)"; $ row [2]和$ rows [3]是你的开始和结束日期。 他们/ 3600用于计算小时数,你可以通过写60而不是3600得到分钟。 至于工作日和假期,您可以设置一个计数器并将其递增数天,并 ...
-
一般来说,您可以使用以下命令在MySQL中生成一系列N个整数: select (@i:=@i+1)-1 as `myval` from someTable,(SELECT @i:=0) gen_sub limit N 请注意,您加入的表(someTable)必须至少有N行。 上面的-1是为了使其基数为零...删除它,你会得到N = 3的1,2,3。 您可以将这些整数提供给DATE_ADD函数以将其转换为一系列日期。 为了便于理解,我们使用日期的一些用户变量。 SET @date_min = '20 ...