模型领域的动态选择

时间:2012-12-23 10:00:18

标签: django django-models

我希望我的模型有order字段,该字段将包含所有相关项目中的项目顺序。

我想在choices中使用IntegerField,其中包含该表中当前现有项目的所有数量。

所以它需要是动态的选择。

如何加载表格中所有现有项目的所有现有“订单”值,并使用此列表进行选择?

2 个答案:

答案 0 :(得分:3)

听起来你想为你的模特建立一个经理:

models.py

from django.db import models


class OrderManager(models.Manager):

    def order_choices(self):
        return [(i, i) for i in OrderModel.objects.values_list('order', flat=True)]


class OrderModel(models.Model): 

    objects = OrderManager()
    order = models.IntegerField()

    class Meta:
        ordering = ['order'] 

    def __unicode__(self):
        return '%i' % self.order

forms.py

from django import forms

from yourapp.models import OrderModel


class OrderModelForm(forms.ModelForm):
    order = forms.ChoiceField(choices=OrderModel.objects.order_choices())

    class Meta:
        model = OrderModel

admin.py

from django.contrib import admin

from yourapp.forms import OrderModelForm
from yourapp.models import OrderModel


class OrderModelAdmin(admin.ModelAdmin):

    form = OrderModelForm


admin.site.register(OrderModel, OrderModelAdmin)

修改

管理员用于进行一般模型查询,而无需具有模型对象的实例。如果您不理解管理器的概念,您仍然可以从管理器类中重构代码,将其粘贴到其他位置并在代码中导入该函数。管理器允许您抽象可以重用的自定义常规查询集。查看更多详情https://docs.djangoproject.com/en/dev/topics/db/managers/

没有经理的代码看起来像

views.py或其他一些文件

from app.models import OrderModel

def order_choices():
    return [(i, i) for i in OrderModel.objects.values_list('order', flat=True)]

如果您想多次重复使用上述代码,请从代码中的任何位置开始:

from app.views import oder_choices

order_choices()

而不是:

from app.models import OderModel

OrderModel.objects.order_choices()

如果您只想使用上述内容,可以将其保留在forms.py中,如另一个答案中所示。这取决于你想如何重构你的代码。

答案 1 :(得分:1)

不要将选项直接添加到模型中,将它们添加到稍后重新描述模型的表单中,方法是使用一组选项覆盖该字段。

,比如:

class MyForm(..):
    myfield_order_field = IntegerField(choices = [(i,i) for range(MyModel.objects.count)])
    class Meta():
        model = MyModel

如果您想在管理员中使用它,请添加到管理员类:

class MyModelAdmin(admin.ModelAdmin):
...

    form = MyForm

它也会在管理员中覆盖此字段。