如何将外键ID转换为值 - Django
我在Django的models.py
文件中定义了以下Models
:
class HadoopDistributor(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Cluster(models.Model):
size = models.IntegerField(default=0)
name = models.CharField(max_length=300, default="")
hadoop_dist = models.ForeignKey(HadoopDistributor)
hadoop_version = models.ForeignKey(HadoopVersion)
dgsecure = models.ForeignKey(DgSecure)
user = models.ForeignKey(User)
datafiles = models.ManyToManyField(Data)
created = models.DateTimeField(default=None)
deleted = models.DateTimeField(default=None, blank=True)
FAILED = 'FL'
RUNNING = 'RN'
SUCCESS = 'SC'
DESTROY = 'DS'
STATUS = (
(FAILED, 'FAILED'),
(RUNNING, 'RUNNING'),
(SUCCESS, 'SUCCESS'),
(DESTROY, 'DESTROY')
)
status = models.CharField(max_length=2,
choices=STATUS,
default=FAILED)
def __str__(self):
return self.name
def __unicode__(self):
pass
class Meta:
ordering = ('hadoop_version', )
所以,一个集群有一个HadoopDistributor
,比如说Cloudera
。然后,在我的views.py
中,我查询了某个特定用户创建的所有集群的列表:
def get_cluster_list(request):
clusters = Cluster.objects.filter(user=request.user)
cluster_obj = serializers.serialize('json',
clusters,
indent=2,
use_natural_foreign_keys=True,
use_natural_primary_keys=True)
return HttpResponse(cluster_obj, content_type="application/json")
现在,当我进行HTTP
的`GET`请求时:
{
"fields": {
"status": "FL",
"hadoop_dist": 1,
"dgsecure": 1,
"name": "",
"created": "2014-10-22T22:58:41Z",
"deleted": "2014-10-22T22:58:41Z",
"user": [
"philippe"
],
"datafiles": [],
"hadoop_version": 2,
"size": 2
},
但我期望得到的值是:
{
"fields": {
"status": "FL",
"hadoop_dist": "Cloudera",
"dgsecure": 1,
"name": "",
"created": "2014-10-22T22:58:41Z",
"deleted": "2014-10-22T22:58:41Z",
"user": [
"philippe"
],
"datafiles": [],
"hadoop_version": 2,
"size": 2
},
解决这个问题的简单方法是用外键的名称替换所有元素,然后返回结果,但我想知道有没有更简单的方法来实现这个。我稍微了解了一下Django
模型中的__unicode__
,但我不太明白这能如何帮助我实现我的目标。有人能帮忙吗?
1 个回答
1
答案是要在 HadoopDistributor
里实现一个叫 natural_key(self)
的方法。
所以
def natural_key(self):
return self.name
顺便提一下,对于 __unicode__
和 __str__
,你真的应该实现:
def __unicode__(self):
return self.name
def __str__(self):
return unicode(self).encode('utf-8')