小编Joh*_*fis的帖子

Django Rest Framework按指定的GET参数分页

我正在使用 Django REST 框架,我需要根据请求提供的 GET 参数对列表进行分页。

我知道我可以'PAGINATE_BY': 10在设置中进行设置,但是我想允许调用者在发出请求时指定他们想要分页的号码。

我目前有以下序列化程序:

from api.models import Countries
from rest_framework import serializers

class CountrySerializer(serializers.Serializer):
    country_geoname_id = serializers.CharField(required=True)
    country_code = serializers.CharField(source="iso", max_length=2L, required=True)
    country_name = serializers.CharField(max_length=64L, required=True)

    def transform_iso(self, obj, value):
        return "country_code"
Run Code Online (Sandbox Code Playgroud)

我尝试了以下观点:

@api_view(['GET'])
def country_list(request):
    """
    List all countries
    """
    if request.method == 'GET':
        queryset = Countries.objects.all()
        serializer = CountrySerializer(queryset, many=True, data=request.DATA)
        paginate_by = request.GET.get('limit', 10)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

但是我觉得我错过了一些东西,我一直无法从文档中弄清楚。

我应该在序列化程序中还是在视图中进行分页?

提前致谢。

python django pagination django-rest-framework

5
推荐指数
1
解决办法
5616
查看次数

Django休息框架单元测试viewsets mixins

我需要对Django REST框架mixin进行单元测试.所以我去做一个看起来像这样的测试:

class TestMyMixin(APITestCase):

    class DummyView(MyMixin,
        viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer

        #some properties omitted

    def setUp(self):
        self.view = self.DummyView.as_view(\
            actions={'get':'list'})

    def test_basic_query(self):
        instance = MyModel.objects.create(\
            **{'name':'alex'})
        request = APIRequestFactory().get(\
            '/fake-path?query=ale',
            content_type='application/json')
        response = self.view(request)
        self.assertEqual(\
            response.status_code,status.HTTP_200_OK)
        json_dict = json.loads(\
            response.content.decode('utf-8'))
        self.assertEqual(json_dict['name'],instance.name)
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个测试时,我确实得到了:

raise ContentNotRenderedError('The response content must be 'django.template.response.ContentNotRenderedError: The response content must be rendered before it can be accessed.
Run Code Online (Sandbox Code Playgroud)

似乎django REST框架会有一些不同的单元测试方法viewsets,mixins并且views.
但我无法弄清楚我该怎么做.
官方文档页面建议使用真实的网址,但它更适合验收测试而不是单元测试.

python django unit-testing django-rest-framework

5
推荐指数
1
解决办法
913
查看次数

日期时间对象上的Django F表达式

我的模型是:

class Test():
   date1 = models.DateTimeField()
   date2 = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)

我可以使用以下查询找出date2大于的对象date1

Test.obejcts.filter(date2__gt=F('date1'))
Run Code Online (Sandbox Code Playgroud)

我想找到所有date2大于date1一年的物体。
如何根据date1和之间的差异找出对象date2

python django django-queryset python-2.7

5
推荐指数
2
解决办法
3570
查看次数

如何在GeoDjango中计算两点之间的3D距离(包括海拔高度)

序幕:

这是在SO中经常出现的一个问题:

我想撰写一个关于SO文档的示例,但是geodjango本章从未停止过,并且自从文档于2017年8月8日关闭以来,我将遵循这个广受赞誉并讨论了元答案的建议,并将我的示例写为自我回答发布。

当然,我也很高兴看到任何其他方法!!


题:

假设模型:

class MyModel(models.Model):
    name = models.CharField()
    coordinates = models.PointField()
Run Code Online (Sandbox Code Playgroud)

我将点存储在coordinate变量中作为lan, lng, alt点的位置:

MyModel.objects.create(
    name='point_name', 
    coordinates='SRID=3857;POINT Z (100.00 10.00 150)')
Run Code Online (Sandbox Code Playgroud)

我正在尝试计算两个这样的点之间的3D距离:

p1 = MyModel.objects.get(name='point_1').coordinates
p2 = MyModel.objects.get(name='point_2').coordinates

d = Distance(m=p1.distance(p2))
Run Code Online (Sandbox Code Playgroud)

现在d=X以米为单位。

如果仅更改其中一个点的高度,则:

例如:

p1.coordinates = 'SRID=3857;POINT Z (100.00 10.00 200)'
Run Code Online (Sandbox Code Playgroud)

从150以前,计算:

d = Distance(m=p1.distance(p2))
Run Code Online (Sandbox Code Playgroud)

d=X再次返回,就像忽略高程一样。
如何计算两点之间的3D距离?

python gis django postgis geodjango

5
推荐指数
1
解决办法
3905
查看次数

如何在管理面板中检查django员工用户的首次登录?

我正在执行django项目,并且正在使用默认的auth应用进行身份验证。
我知道last_login用户模型中有一个字段,用于存储用户的上次登录时间。

当职员用户首次登录到管理面板时,我想检查该last_login字段是否为None并将其重定向到更改密码页面。

我应该把这张支票放在哪里?


到目前为止我尝试过的是:

我尝试使用自定义登录表单并覆盖其默认confirm_login_allowed方法,但看来我只能提出验证错误以阻止使用这些表单的登录尝试。

我也尝试使用django.contrib.auth.signals.user_logged_inSignal,但也不允许在last_loginis 时返回重定向响应None

我想知道在验证用户身份后如何返回重定向响应。

python django django-admin

5
推荐指数
2
解决办法
2167
查看次数

用于同时编辑具有外键关系的两个 Django 模型的表单

我试图找到一种简单的方法来创建允许同时编辑具有外键关系的两个模型的表单。

经过一些研究,似乎内联表单集非常接近我想要做的。

django 文档提供了这个例子:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

进而,

>>> from django.forms import inlineformset_factory
>>> BookFormSet = inlineformset_factory(Author, Book, fields=('title',))
>>> author = Author.objects.get(name='Mike Royko')
>>> formset = BookFormSet(instance=author)
Run Code Online (Sandbox Code Playgroud)

让我们假设Author有第二个字段,city。我可以使用fields参数在表单中添加一个城市吗?

如果内联表单集不是要走的路,是否有另一种方法可以生成这种联合表单?


经过更多的研究,我找到了django 模型表单。包括来自 2009 年相关模型的字段,这暗示内联表单集可能不是要走的路。

如果有不同工厂的默认解决方案,我会非常感兴趣。

python django django-forms

5
推荐指数
1
解决办法
2047
查看次数

Django 层次结构权限

我想在我的 Django 应用程序中拥有层次级别权限。

例如:- 考虑有 4 个级别 -

Admin
Sub-admin(CountryLevel(CL) Admin)
sub-sub-admin(StateLevel(SL) Admin)
And then normal Users(U).
Run Code Online (Sandbox Code Playgroud)

管理员将创建 CL,作为回报,CL 将创建 SL,而 SL 最终将吸引用户。最终目标是吸引用户。

管理员有权对任何用户应用 CRUD 操作。CL 应该有权访问由 CL 创建的 SL 加入(创建)的用户(对象)。作为回报,SL 应该只能访问由他加入(创建)的那些用户(对象)。此外,用户可以直接注册,无需任何管理员参与。在这种情况下,用户应有权访问他自己的应用程序。

我怎样才能获得像树级别的权限?

我能想到的解决方案是(但不确定):-

我已经更新了auth_group表格并添加parent_id到其中。以下是架构。

id, group_name, parent_id
Run Code Online (Sandbox Code Playgroud)

的意义parent_id在于创建一个树状的组结构。创建的组数等于树的高度。例如,考虑以下结构:-

id, group_name, parent_id

1 , admin, 0
2, CL, 1
3, SL, 2
Run Code Online (Sandbox Code Playgroud)

现在,当创建任何用户(加入)时,我将分配一个SL group_id,它将添加到auth_user_groups表中。

现在,我想问以下问题

1)如何管理组的层次权限,即SL应该只能访问他所加入的用户,CL应该能够访问他创建的SL所加入的所有用户等等。

2)(不确定我的想法是否正确)现在,由于我已将组 SL 分配给 SL 加入的所有用户,作为同一组的一部分,用户是否能够访问彼此的信息?

3) 对于直接加入的用户(即不通过任何 SL),我不会将他们映射到任何组。正确的?

python django django-permissions

5
推荐指数
1
解决办法
2432
查看次数

如何使用 Django Rest Framework 序列化程序构建我的 JSON 响应?

我有一个数据库表:

servicenumber | meternumber | usagedatetime | usage
11111         | 22222       | 2019-01-01    | 1.85
11111         | 22222       | 2019-01-02    | 2.25
11111         | 22222       | 2019-01-03    | 1.55
11111         | 22222       | 2019-01-04    | 2.15
11111         | 33333       | 2019-02-01    | 2.95
11111         | 33333       | 2019-02-02    | 3.95
11111         | 33333       | 2019-02-03    | 2.05
11111         | 33333       | 2019-02-04    | 3.22
Run Code Online (Sandbox Code Playgroud)

如您所见,一个服务编号可以与多个仪表编号相关联。将服务编号视为不变的地理位置的唯一标识符。

我有一个 Django 模型:

class MeterUsage(models.Model):

    objectid = models.IntegerField(
        db_column='OBJECTID', unique=True, primary_key=True)

    servicenumber = models.IntegerField(
        db_column='serviceNumber', …
Run Code Online (Sandbox Code Playgroud)

python django serialization django-rest-framework

5
推荐指数
1
解决办法
1180
查看次数

在 Docker 中安装地理空间库

Django 的官方文档列出了开始开发 PostGIS 应用程序所需的 3 个依赖项。他们根据数据库列出一个表。

我使用 docker 进行本地开发,但我很困惑哪些包应该安装在 Django 容器中,哪些包应该安装在 PostgreSQL 容器中。我猜其中一些应该同时存在。

我将非常感谢您对此的帮助。

django postgresql postgis gdal geodjango

5
推荐指数
1
解决办法
1614
查看次数

如何在Django Admin中为计算的模型属性实现排序,而无需编写两次逻辑?

在我的Django中model,我定义了一个@property效果很好的属性,该属性可以在管理中显示,list_display没有任何问题。

我不仅需要在管理员中使用此属性,还需要在其他地方的代码逻辑中使用此属性,因此将其作为模型的属性是有意义的。

现在,我想使此属性的列可排序,并在When对象的Django文档的帮助下,此F()计算的StackOverflow问题以及此排序的链接,我设法构建了如下所示的工作解决方案。

在这里提出问题的原因是:实际上,我实现了两次逻辑,一次在python中实现,一次以表达式形式实现,这违反了只实现一次逻辑的设计规则。所以我想问我是否错过了一个更好的解决方案。任何想法表示赞赏。

这是模型(标识已修改):

class De(models.Model):

    fr = models.BooleanField("[...]")
    de = models.SmallIntegerField("[...]")
    gd = models.SmallIntegerField("[...]")
    na = models.SmallIntegerField("[...]")
    # [several_attributes, Meta, __str__() removed for readability]

    @property
    def s_d(self):
        if self.fr:
            return self.de
        else:
            return self.gd + self.na
Run Code Online (Sandbox Code Playgroud)

这是Model Admin

class DeAdmin(admin.ModelAdmin):
    list_display = ("[...]", "s_d", "gd", "na", "de", "fr" )

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        queryset = queryset.annotate(
            _s_d=Case(
                When(fr=True, then='s_d'),
                When(fr=False, then=F('gd') + …
Run Code Online (Sandbox Code Playgroud)

python django django-admin

5
推荐指数
1
解决办法
150
查看次数