小编oma*_*mat的帖子

如何使用Python将GEOS MultiLineString转换为多边形?

我正在开发一个GeoDjango应用程序,用户可以在其中上传地图文件并执行一些基本的映射操作,例如查询多边形内的要素。

我认识到用户有时会上传“ MultiLineString”而不是“ Polygon”。这会导致期望封闭几何的查询失败。

在Python中将MultiLineString对象转换为Polygon的最佳方法是什么?

谢谢。

-oMat

python gis polygon geos multilinestring

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

Django:管理员中的AJAX ManyToManyField

我想像ManyToManyField管理员一样在管理员中显示s filter_horizontal,但是当用户键入过滤器字段时填充选项.有很多选项,一次加载它们需要花费很多时间.

我找到了django-ajax-filtered-fields,但在我看来它是一种矫枉过正,因为它需要更改模型类,当我想要做的就是替换表单中的每个多个select字段.

编写继承的自定义窗口小部件字段admin.widgets.FilteredSelectMultiple似乎是正确的方法.所以我试图推出自己的小部件:

class MultiSelectWidget(FilteredSelectMultiple):
    class Media:
        # here should be some js to load options dynamically
        js = (
            "some_js_to_load_ajax_options.js",
        )

    def render_options(self, choices, selected_choices):
        # this initializes the multiple select without any options
        choices = [c for c in self.choices if str(c[0]) in selected_choices]
        self.choices = choices
        return super(MultiSelectWidget, 
                     self).render_options([], selected_choices)

class MyAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyAdminForm, self).__init__(*args, **kwargs)
        self.fields['m2m_field'].widget = MultiSelectWidget('m2m_field', is_stacked=False)
    class Meta:
        model = MyModel

class …
Run Code Online (Sandbox Code Playgroud)

django ajax django-admin manytomanyfield

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

Django形式:大多数DRY方式来组织继承模型的创建/更新表单

我有2个这样的多表继承模型:

class Post(models.Model):
    title = models.CharField(max_length=100, blank=True, null=True)
    text = models.TextField(blank=True, null=True)
    location = models.PointField()
    ...

class BlogPost(Post):
    blog = models.ForeignKey(Blog)
Run Code Online (Sandbox Code Playgroud)

同样,BlogPost的表单类也继承自PostForm类:

class PostForm(MapModelForm):
    ...
    class Meta:
        model = Post

    def clean(self):
        ...

class BlogPostForm(PostForm):
    class Meta:
        model = BlogPost
Run Code Online (Sandbox Code Playgroud)

我曾经在两个非基于类的视图中处理两个模型的创建/更新.为了让事情变得干燥,我决定尝试给Django基于类的通用视图.但由于缺乏相关文件的例子和用户不友好以及各种方法,我很困惑.

我们的想法是为Post模型提供基于类的表单视图,并为其继承它们BlogPost.我该如何定制视图类?

我应该有单独的PostCreate和PostUpdate视图吗?然后这两个类几乎完全相同,而不是DRY.

我是否应该单独FormView更新/创建帖子?它适用于创建,但我无法弄清楚如何进行更新.

我应该使用提供的mixin类而不是直接从视图继承来构建自定义视图(或创建/更新的两个视图)吗?

django django-forms django-class-based-views

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

Django ORM:过滤日期时间字段的时间增量

我试图根据两个DateTimeFields的时间差来获取帖子,例如,在发布后不到 10 分钟内删除的帖子。

class Post(models.Model):
    ...
    time_posted = models.DateTimeField()
    time_deleted = models.DateTimeField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

有了上面的模型,我试过了;

from datetime import timedelta

Post.objects.exclude(deleted__isnull=True).annotate(
    delta=F('time_deleted') - F('time_posted')
).filter(delta__lt=timedelta(minutes=10))
Run Code Online (Sandbox Code Playgroud)

并得到了一个TypeError: expected string or buffer. 然后我认为这可能是类型的变化(DateTime 对象产生 Time 对象)所以我尝试了ExpressionWrapper

Post.objects.exclude(deleted__isnull=True).annotate(
    delta=models.ExpressionWrapper(
        F('time_deleted') - F('time_posted'), 
        output_field=models.TimeField())
    ).filter(delta__gt=timedelta(minutes=10))
Run Code Online (Sandbox Code Playgroud)

但这也导致了同样的异常。

任何帮助深表感谢。

编辑

根据@ivan 的建议,我DurationField()改为尝试。我不再遇到异常,但 delta 总是0.

>>> post = Post.objects.exclude(deleted__isnull=True).annotate(
        delta=ExpressionWrapper(F('deleted') - F('time'), 
        output_field=DurationField())
    ).first()
>>> post.time_posted
datetime.datetime(2015, 8, 24, 13, 26, 50, 857326, tzinfo=<UTC>)
>>> post.time_deleted
datetime.datetime(2015, 8, 24, …
Run Code Online (Sandbox Code Playgroud)

django django-orm django-aggregation

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

Django MultipleChoiceField不保留所选值的顺序

我有一个Django ModelForm,它通过一个模型来公开对应于多对多关系的多选字段,该模型将order选择(文档列表)作为额外属性.在前端,该字段显示为两个与admin中类似的多个选择字段,一个列出可用选项,另一个列出所选元素.

可以使用正确的元素选择保存表单,但它们始终按原始选择顺序排列,而不是选择顺序.浏览器以正确的顺序发送选择,但顺序输入form.cleaned_data['documents']始终是原始顺序的顺序.

如何使MultipleChoiceField尊重所选元素的顺序?

谢谢.

django django-forms cleaned-data

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

Django annotate和values():'group by'中的额外字段会导致意外结果

我必须遗漏一些明显的东西,因为这种简单的要求不符合预期.这是我的模型类:

class Encounter(models.Model):
    activity_type = models.CharField(max_length=2, 
                           choices=(('ip','ip'), ('op','op'), ('ae', 'ae')))
    cost = models.DecimalField(max_digits=8, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)

我想找到每种活动类型的总费用.我的查询是:

>>> Encounter.objects.values('activity_type').annotate(Sum('cost'))
Run Code Online (Sandbox Code Playgroud)

产量:

>>> [{'cost__sum': Decimal("140.00"), 'activity_type': u'ip'}, 
     {'cost__sum': Decimal("100.00"), 'activity_type': u'op'}, 
     {'cost__sum': Decimal("0.00"), 'activity_type': u'ip'}]
Run Code Online (Sandbox Code Playgroud)

在结果集中有2个'ip'类型遇到.这是因为它不是仅activity_type活动类型和成本分组,而是没有给出预期结果.生成的SQL查询是:

SELECT "encounter_encounter"."activity_type", 
    SUM("encounter_encounter"."total_cost") AS "total_cost__sum" 
    FROM "encounter_encounter" 
    GROUP BY "encounter_encounter"."activity_type", 
             "encounter_encounter"."total_cost"        <<<< THIS MESSES THINGS
    ORDER BY "encounter_encounter"."total_cost" DESC
Run Code Online (Sandbox Code Playgroud)

如何使这个查询按预期工作(如果我没有弄错的话,如文档所暗示的那样)并使它只进行一个分组activity_type

django annotations group-by django-orm

3
推荐指数
1
解决办法
5378
查看次数

Django 管理员:添加自定义列表视图的最佳方法是什么?

我想在管理中提供一个与 非常相似的自定义视图changelist_view(),但没有指向编辑表单视图的链接。用户将能够选择列表中的项目并应用操作,就像在更改列表表单中一样,但他们无权访问编辑表单。

我认为ModelAdmin类中的结构应该是这样的:

class ProductAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(ProductAdmin, self).get_urls()
        urls += patterns('',
            (r'^selectlist/$', self.selectlist_view)
        )
        return urls

    def selectlist_view(self):
        return render_to_response(...)
Run Code Online (Sandbox Code Playgroud)

要返回的视图与 非常相似ModelAdmin.changelist_view()。最好的、DRY 的方法是什么?

python django django-admin custom-view

2
推荐指数
1
解决办法
5206
查看次数

django:SplitDateTimeWidget忽略date_format

我正在尝试使用SplitDateTimeWidget,但希望它以日 - 月 - 年格式接受日期.

from django.forms.widgets import SplitDateTimeWidget

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        widgets = {'start': SplitDateTimeWidget(date_format='%d/%m/%Y')}
Run Code Online (Sandbox Code Playgroud)

SplitDateTimeWidget接受一个date_format参数,我希望该参数用于验证日期输入,但事实并非如此.

默认窗口小部件已正确替换,但它忽略了date_format,并坚持要对默认的月 - 日 - 年进行验证.

我也试过没有运气设置DATE_FORMAT和DATE_INPUT_FORMATS设置.

谢谢你的帮助.

django django-forms django-widget

0
推荐指数
1
解决办法
3426
查看次数