小编Wan*_*der的帖子

在Django Admin中使用DateTimeField保存模型实例会失去微秒的分辨率

在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字段在保存回数据库时将失去微秒分辨率.

大多数应用程序不需要那么高的准确度,但对于需要这样的应用程序,能够消除这种分辨率损失的所有可能原因将是很好的.是否有任何已知的方法/功能来防止这种情况或这是一个错误/限制?

python django django-models django-orm django-admin

8
推荐指数
1
解决办法
1204
查看次数

Django REST框架序列化程序:显示反向关系的最新对象

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)

django django-rest-framework

4
推荐指数
1
解决办法
1160
查看次数