在Django 1.8中,让我们说我们有这个非常简单的模型:
class Log(models.Model):
remarks = models.TextField()
timestamp = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)
当我将模型实例保存到PostgreSQL数据库时,该timestamp字段将具有微秒.我注意到如果我尝试从Django管理员编辑特定的模型实例,该timestamp字段在保存回数据库时将失去微秒分辨率.
大多数应用程序不需要那么高的准确度,但对于需要这样的应用程序,能够消除这种分辨率损失的所有可能原因将是很好的.是否有任何已知的方法/功能来防止这种情况或这是一个错误/限制?
ListAPIView(下面的代码)的默认行为是序列化所有Report对象和每个Report对象的嵌套Log对象.如果我只希望每个报告显示最新的Log对象怎么办?我该怎么做呢?
# models.py
class Log(models.Model):
# ...
report = models.ForeignKey(Report)
timestamp = models.DateTimeField(default=datetime.datetime.now)
class Report(models.Model):
code = models.CharField(max_length=32, unique=True)
description = models.TextField()
# serializers.py
class LogSerializer(serializers.ModelSerializer):
class Meta:
model = Log
class ReportSerializer(serializers.ModelSerializer):
log_set = LogSerializer(many=True, read_only=True)
class Meta:
model = Report
fields = ('code', 'description', 'log_set')
# views.py
class ReportListView(generics.ListAPIView):
queryset = Report.objects.all()
serializer_class = ReportSerializer
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过使用SerializerMethodField来实现这一点,但这可能是一个可能很昂贵的操作,因为会有一个额外的SQL查询来检索每个Report对象的相应Log对象.
class ReportSerializer(serializers.ModelSerializer):
latest_log = serializers.SerializerMethodField()
class Meta:
model = Report
def get_latest_log(self, obj):
try:
latest_log = Log.objects.filter(report_id=obj.id).latest('timestamp')
except Log.DoesNotExist:
latest_log = None …Run Code Online (Sandbox Code Playgroud)