如何将外键ID转换为值 - Django

0 投票
1 回答
1380 浏览
提问于 2025-04-29 07:55

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

撰写回答