代码之家  ›  专栏  ›  技术社区  ›  AdmiralNemo

Django Model Manager使用_来处理与_相关的_字段和ModelAdmin关系

  •  0
  • AdmiralNemo  · 技术社区  · 16 年前

    在使用管理界面时,我很难让我的模型管理器正常工作。基本上,我有两个模型:

    class Employee(models.Model):
        objects = models.EmployeeManager()
        username = models.CharField(max_length=45, primary_key=True)
        . . .
    
    class Eotm(models.Model): #Employee of the Month
        date = models.DateField()
        employee = models.ForeignKey(Employee)
        . . .
    

    我有一个 EmployeeManager 类重写 get() 方法,类似于:

    class EmployeeManager(models.Manager):
        use_for_related_fields = True
    
        def get(self, *arguments, **keywords):
            try:
                return super(EmployeeManager, self).get(*arguments, **keywords)
            except self.model.DoesNotExist:
                #If there is no Employee matching query, try an LDAP lookup and create
                #a model instance for the result, if there is one.
    

    基本上,我们的想法是 Employee 如果数据库中不存在对象,则会根据Active Directory中的信息自动创建这些对象。这在我的应用程序代码中很有效,但是当我尝试为 Eotm 模特,情况不太好。我替换了默认的小部件 ForeignKey 字段与 TextInput 小部件,用户可以键入用户名(因为 username 是主键)。理论上,这应该叫做 EmployeeManager.get(username='whatever') ,它将返回 员工 就像默认的管理器一样,或者创建一个并返回它(如果还不存在的话)。问题是,我的经理没有被利用。

    我在Django文档中找不到有关使用自定义 Manager 类和管理站点,除了 generic manager documentation . 我确实找到了 blog entry 关于指定自定义管理器 ModelAdmin 类,但这并不真正有帮助,因为我不想更改由 模型管理员 类,但它与之相关。

    1 回复  |  直到 16 年前
        1
  •  0
  •   Jordan Reiter    16 年前

    我可能不理解您在这里要做什么,但是您可以为您的EOTM模型使用自定义表单:

    #admin.py
    from forms import EotmAdminForm
    
    class EotmAdmin(models.ModelAdmin):
        form = EotmAdminForm
    
    
    #forms.py
    from django import forms
    from models import Eotm, Employee
    
    class EotmAdminForm(forms.ModelForm)
        class Meta:
            model = Eotm
    
        def clean_employee(self):
            username = self.cleaned_data['employee']
            return Employee.get(username=username)
    

    从理论上讲,这是可行的。我还没有测试过。

    推荐文章