Преодоление «выбора» должно быть итеративным, содержащим (фактическое значение, удобочитаемое имя) кортежи без внешнего ключа?

Я надеюсь, что это было сделано раньше - по сути, и, надеюсь, я объясню это правильно, мне нужна модель с некоторыми вариантами (как показано ниже).

Я хочу обойти «выбор», который должен быть повторяемым, содержащим (фактическое значение, удобочитаемое имя) ошибку кортежей при добавлении третьего или четвертого значения в кортеж выбора для модели.

Эти варианты влияют не только непосредственно на поле, из которого вы выбираете, но и на несколько других полей. Я видел вещи, в которых поле заголовка заполняется автоматически, например, из заголовка сообщения в блоге, но существует ли какой-либо метод для привязки нескольких полей к определенному выбору?

class Location(models.Model):

  SERVICE_CHOICES = (
    ('bus_station', 'Bus Station', '#cdcdcd'),
    ('cafe', 'Café', '#cdcdcd'),
    ('cinema', 'Cinema', '#cdcdcd'),
    ('gardens', 'Public Gardens', '#cdcdcd'),
    ('library', 'Library'),
    ('public_services', 'Public Services'),
    ('railway_station', 'Railway Station'),
    ('restaurant', 'Restaurant'),
    ('school', 'School'),
    ('shop', 'Shop'),
    ('supermarket', 'Supermarket'),
    ('tourist_attractions', 'Tourist Attractions'),
    ('transit_station', 'Transit Station'),
    ('walks', 'Walks'),
    ('woodland', 'Woodland'),
  )

  locale_descriptor = models.CharField("Locale Descriptor", max_length=50, default='')
  latitude = models.DecimalField("Latitude", max_digits=10, decimal_places=7)
  longitude = models.DecimalField("Longitude", max_digits=10, decimal_places=7)
  title = models.CharField("Title", max_length=60, default='')
  description = models.TextField("Description")
  service_type = models.CharField("Service Type", max_length=80,choices=SERVICE_CHOICES, default='public_service')

Кто-нибудь знает, как автоматически заполнить поле в зависимости от этих вариантов?


person Community    schedule 11.02.2018    source источник
comment
... Почему бы просто не разрезать элементы?   -  person Ignacio Vazquez-Abrams    schedule 11.02.2018
comment
Не могли бы вы объяснить дальше ...   -  person    schedule 11.02.2018
comment
Это список кортежей? Не уверен, что сможешь просто нарезать ...?   -  person    schedule 11.02.2018
comment
Конечно вы можете. Просто повторяйте.   -  person Ignacio Vazquez-Abrams    schedule 11.02.2018
comment
Эррррр ... а как настроить выбор? А затем предварительно заполнить другие поля? Есть еще один вопрос, что просто манипулирование кортежем ...   -  person    schedule 11.02.2018
comment
Здесь может быть полезен класс Choices с его Options возможности?   -  person match    schedule 11.02.2018


Ответы (1)


Я не получаю совершенно ясного представления о том, что вы пытаетесь сделать, но похоже, что вам нужны отношения ForeignKey вместо того, чтобы пытаться увеличить кортеж вариантов. Что-то вроде этого:

class ServiceType(models.Model):
    def __unicode__(self):
        return self.service_name

    service_name = modes.CharField(max_length=80)
    color = modes.CharField(max_length=7)


class Location(models.Model):
    locale_descriptor = models.CharField("Locale Descriptor", max_length=50, default='')
    latitude = models.DecimalField("Latitude", max_digits=10, decimal_places=7)
    longitude = models.DecimalField("Longitude", max_digits=10, decimal_places=7)
    title = models.CharField("Title", max_length=60, default='')
    description = models.TextField("Description")
    service_type = models.ForeignKey(ServiceType)

Не знаю, как вы хотите повлиять на другие поля, но это можно сделать, перезаписав метод save() или реализовав метод clean(). Один пример: «Django. Переопределить сохранение для модели».

person Travis    schedule 15.05.2018