Python Django:基于标识符将数据填充到模型中

Python Django:基于标识符将数据填充到模型中,python,django,django-models,model,freebase,Python,Django,Django Models,Model,Freebase,在我的Django项目中,假设我有以下模型: class City(models.Model): name = models.CharField(max_length=255) freebase_id = models.CharField(max_length=255) latitude = models.DecimalField() longitude = models.DecimalField() area = models.IntegerField(

在我的Django项目中,假设我有以下模型:

class City(models.Model):
    name = models.CharField(max_length=255)
    freebase_id = models.CharField(max_length=255)
    latitude = models.DecimalField()
    longitude = models.DecimalField()
    area = models.IntegerField()
(为了简单起见,我省略了DecimalField所需的参数)

用户可以手动输入所有字段,但我想让用户在管理区域中输入某种ID,比如Freebase ID(例如),这样我们就可以使用API获取诸如
纬度
经度
区域
之类的内容,从而简化工作

长话短说,我想让用户提供一些ID,然后可以用来派生模型内的其他数据。在理想情况下,派生字段最初应该隐藏在管理系统中,但在填充后应使其可见,以便对其进行编辑


这样做可能吗?

如果覆盖对象的save()方法,则可以在该方法中设置lat long。但现在不确定是否以这种方式隐藏字段。在最新的Django中有一些新的只读字段,如果你能通过一个自定义的管理器神奇地做到这一点,你可能会有一种方法…

我正在我的
用户档案
模型中做类似的事情。我有一个邮政编码字段,如果用户填写该字段,它将用于进行地理查找,以获取城市/州和lat/lng,并将其存储在模型中各自的字段中:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    ...
    zip = models.CharField(max_length=12, blank=True, null=True)
    city_state = models.CharField(max_length=30, blank=True, null=True)
    lat = models.DecimalField(max_digits=12, decimal_places=9, blank=True, null=True)
    lng = models.DecimalField(max_digits=12, decimal_places=9, blank=True, null=True)

    def save(self, *args, **kwargs):
        if self.zip:
            (city_state, lat, lng) = get_lat_lng(self.zip)
            if city_state and lat and lng:
                self.city_state = city_state
                self.lat = lat
                self.lng = lng

        super(UserProfile, self).save(*args, **kwargs)

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('zip',)

请注意,派生表单的
zip
字段是用户唯一可见的字段。

谢谢,这听起来是个不错的解决方案。我想如果您想随后显示lat和lng字段以供以后编辑,那么您可以将条件语句放在“fields=”周围的元类中。此外,您还可以将模型单独传递给模板,只需将任何字段数据显示为“只读”。例如,在可编辑的
zip
字段旁边,我显示
city\u state
字符串(一旦计算),以便每次更新zip时,用户都可以验证其城市/状态。