Несколько ManyToMany в Django Admin

Проблема с водительскими правами. В лицензии есть имя человека, которому присваивается несколько категорий навыков вождения. Каждая категория навыков вождения имеет одну дату продления и возможные несколько связанных ограничений.

Name Lic Cat Renewal date Restrictions
Tommy AM 12/05/15 44.01, 101, 999
Tommy E+B 14/12/16
Tommy C 18/04/18 101
TG E+C 14/12/16 90, 101, 999,
TG B 18/04/18 105

модели.py

class Employee(models.Model):
    name = models.CharField(max_length=75)

class DrivingLicenceCategory(models.Model):
    name = models.CharField(max_length=11)

class IssuingBody(models.Model):
    name = models.CharField(max_length=75)

class DrivingLicence(models.Model):
    employee_id     = models.ForeignKey(Employee)
    driver_number   = models.CharField(max_length=49)
    permit_number   = models.CharField(max_length=49)
    issuing_body    = models.ForeignKey(IssuingBody)
    expiry_date     = models.DateField()

class DrivingLicenceRestrictions(models.Model):
    name        = models.CharField(max_length=21)
    description = models.CharField(max_length=1024, blank=True, null=True)

class DrivingLicenceCategoryRestrictions(models.Model):
    licence_category    = models.ForeignKey(DrivingLicenceCategory)
    licence_restriction = models.ForeignKey(DrivingLicenceRestrictions)
    expiry_date         = models.DateField()

class DrivingLicenceDetail(models.Model):
    driving_licence         = models.ForeignKey(DrivingLicence)
    category_restriction    = models.ManyToManyField(DrivingLicenceCategoryRestrictions)

admin.py

from django.contrib import admin
from drvlic.models import *

class DrvLicIssuingBodyAdmin(admin.ModelAdmin):
    search_fields = ('^name', )

class DrvLicCategoryAdmin(admin.ModelAdmin):
    search_fields = ('^name',)

class DrvLicRestrictionsAdmin(admin.ModelAdmin):
    search_fields = ('^name', )
    list_display        = ('id', 'name', 'description',)

class DrvLicLicenceAdmin(admin.ModelAdmin):
    search_fields = ('^employee',)

class DrvLicCategoryRestrictionsAdmin(admin.ModelAdmin):
    search_fields       = ('^employee',)
    filter_horizontal   = ('licence_category', 'licence_restriction')

admin.site.register(DrvLicIssuingBody, DrvLicIssuingBodyAdmin)
admin.site.register(DrvLicCategory, DrvLicCategoryAdmin)
admin.site.register(DrvLicRestrictions, DrvLicRestrictionsAdmin)
admin.site.register(DrvLicLicence, DrvLicLicenceAdmin)
admin.site.register(DrvLicCategoryRestrictions, DrvLicCategoryRestrictionsAdmin)

Подходит ли моя модель для создания приведенной выше таблицы в Django Admin или модель должна быть другой? Как настроить admin.py, чтобы разрешить доступ и ввести данные?

Джанго говорит мне, что 'DrvLicCategoryRestrictionsAdmin.filter_horizontal[0]' must be a ManyToManyField'. Я думаю, что это не имеет значения, если models.py построен неправильно.


person Tommy Gibbons    schedule 03.03.2015    source источник
comment
согласно документации docs.djangoproject .com/en/1.7/ref/contrib/admin/ и, как предполагает ошибка, это должно быть поле M2M. Похоже, вы использовали там внешний ключ.   -  person Ankit Popli    schedule 03.03.2015


Ответы (1)


Вам не нужен '^' для поля поиска. Просто search_fields = 'name' должно быть достаточно. Чтобы отобразить ManyToManyField, вам нужно перебрать все связанные объекты. Но даже до этого момента, я думаю, вам нужно реструктурировать свои модели, чтобы иметь одну «всеохватывающую» модель, которая содержит ту таблицу, которую вы пытаетесь создать. Итак, что-то вроде:

модели.py

class License(models.Model):
    employee = models.ForeignKey(Employee)
    category = models.ManyToMany(DrivingLicenceCategory)
    restriction = models.ManyToMany(DrivingLicenceRestrictions)
    expiry_date = models.DateField()

    def get_categories(self):
        return ",<br>".join([a.name for a in self.category.all()])

    def get_restrictions(self):
        return ",<br>".join([a.name for a in self.restriction.all()])

admin.py

class LicenseAdmin(admin.ModelAdmin):
    list_display = ('employee', 'get_categories', 'get_restrictions', 'expirary_date')
person plact    schedule 03.03.2015