【问题标题】:Overcoming 'choices' must be an iterable containing (actual value, human readable name) tuples without Foreign Key?克服“选择”必须是一个可迭代的包含(实际值,人类可读名称)元组,没有外键?
【发布时间】:2018-07-21 21:16:33
【问题描述】:

我希望这之前已经完成了 - 本质上,希望我能正确解释这一点,我想要的是一个有一些选择的模型(如下所示)。

当向模型的选择元组添加第三个或第四个值时,我想绕过“选择”必须是包含(实际值,人类可读名称)元组的可迭代错误。

这些选择不仅会直接影响您从中选择的字段,还会影响其他几个字段。我见过自动填充 slug 字段的情况,例如博客文章标题,但是是否存在将多个字段绑定到某个选择的方法?

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')

有人知道如何根据这些选择自动填充字段吗?

【问题讨论】:

  • ... 为什么不直接切片元素呢?
  • 你能解释一下吗...
  • 这是一个元组列表?不确定你可以切片...?
  • 当然可以。只是迭代。
  • Errrr... 以及如何设置选项?然后预填充其他字段?只是操纵元组的问题还有更多......

标签: django django-models python-3.5 django-1.11


【解决方案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. Override save for model”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多