Не обязательное поле ForeignKey в Django ORM

Дата публикации: 02-05-2013 | Автор: MelfisFettel | Рубрика: Django

Python Django ORMТак вышло, что необходимо было создать таблицу с тремя ForeignKey которые указывали бы на одну и ту же таблицу, и только одно из них должно было бы быть обязательным. Немного покопавшись, оказалось что одного blank=True мало. Так же при попытке выставить поле в ForeignKey(table_name, null=True) админка ругалась на то что поле обязательное (При попытке добавления новой записи).

Оказалось задача решается на редкость просто. Достаточно указать эти два параметра вместе. Предположим что имеем следующую структуру модели:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ZTType(models.Model):
    vname = models.CharField(u'Название', max_length=50)
    imagepath = models.CharField(u'Картинка', max_length=100, blank = True)
    class Meta:
        verbose_name = u'Тип запчастей'
        verbose_name_plural = u'Типа запчастей'
    def __unicode__ (self):
        return '%s' % (self.vname)
    
class NKItems(models.Model):
    parent = models.ForeignKey(ZTType)
    parent2 = models.ForeignKey(ZTType)
    parent3 = models.ForeignKey(ZTType)
    vname = models.CharField(u'Название', max_length=50)
    avname = models.CharField(u'Альтернативное Название', max_length=50, blank = True)
    imagepath = models.CharField(u'Картинка', max_length=100, blank = True)
    .................
    class Meta:
        verbose_name = u'Номенклатура'
        verbose_name_plural = u'Номенклатура'
    def __unicode__ (self):
        return '%s' % (self.vname)
class ZTType(models.Model):
    vname = models.CharField(u'Название', max_length=50)
    imagepath = models.CharField(u'Картинка', max_length=100, blank = True)
    class Meta:
        verbose_name = u'Тип запчастей'
        verbose_name_plural = u'Типа запчастей'
    def __unicode__ (self):
        return '%s' % (self.vname)
    
class NKItems(models.Model):
    parent = models.ForeignKey(ZTType)
    parent2 = models.ForeignKey(ZTType)
    parent3 = models.ForeignKey(ZTType)
    vname = models.CharField(u'Название', max_length=50)
    avname = models.CharField(u'Альтернативное Название', max_length=50, blank = True)
    imagepath = models.CharField(u'Картинка', max_length=100, blank = True)
    .................
    class Meta:
        verbose_name = u'Номенклатура'
        verbose_name_plural = u'Номенклатура'
    def __unicode__ (self):
        return '%s' % (self.vname)

Теперь что бы получить три ForeignKey в Django, достаточно немного дополнить таблицу NKItems:

1
2
3
4
5
6
7
8
9
10
11
12
13
class NKItems(models.Model):
    parent = models.ForeignKey(ZTType, related_name='parent')
    parent2 = models.ForeignKey(ZTType, related_name='parent2', blank=True, null=True)
    parent3 = models.ForeignKey(ZTType, related_name='parent3', blank=True, null=True)
vname = models.CharField(u'Название', max_length=50)
    avname = models.CharField(u'Альтернативное Название', max_length=50, blank = True)
    imagepath = models.CharField(u'Картинка', max_length=100, blank = True)
    .................
    class Meta:
        verbose_name = u'Номенклатура'
        verbose_name_plural = u'Номенклатура'
    def __unicode__ (self):
        return '%s' % (self.vname)
class NKItems(models.Model):
    parent = models.ForeignKey(ZTType, related_name='parent')
    parent2 = models.ForeignKey(ZTType, related_name='parent2', blank=True, null=True)
    parent3 = models.ForeignKey(ZTType, related_name='parent3', blank=True, null=True)
vname = models.CharField(u'Название', max_length=50)
    avname = models.CharField(u'Альтернативное Название', max_length=50, blank = True)
    imagepath = models.CharField(u'Картинка', max_length=100, blank = True)
    .................
    class Meta:
        verbose_name = u'Номенклатура'
        verbose_name_plural = u'Номенклатура'
    def __unicode__ (self):
        return '%s' % (self.vname)

После чего в Админке Django можно спокойно выбирать от одного до трех заполненных полей с ForeignKey

Понравилась статья? Расскажи друзьям:


Обсудить