Django:根据标识符将数据填充到模型中

时间:2011-01-23 20:35:44

标签: 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()

(为简单起见,我省略了DecimalField所需的参数)。

用户可以手动输入所有字段,但我希望让用户在管理区域中输入某种ID,比如Freebase ID(例如/en/manchester_united_kingdom),从而让生活更轻松,这样我们就可以了然后可以使用API​​来获取latitudelongitudearea等内容。

长话短说,我想让用户提供一些ID,然后可以用它来获取模型中的其他数据。在理想的世界中,派生字段应该最初隐藏在管理系统中,但一旦填充就可以显示,以便可以对它们进行编辑。

这样的事情可能吗?

2 个答案:

答案 0 :(得分:2)

我在UserProfile模型中做了类似的事情。我有一个邮政编码字段,如果它被用户填写,则用于进行地理查找以获取城市/州和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字段是用户可见的唯一字段。

答案 1 :(得分:0)

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