【问题标题】:What's the best way to have value object using Django data model?使用 Django 数据模型拥有值对象的最佳方式是什么?
【发布时间】:2012-03-01 21:41:29
【问题描述】:

我们的 Django 数据模型对象很好地映射到数据库表。我们想要一种将两个或多个表中的数据打包成自定义结构的方法,以便我们可以轻松地将其作为 JSON 提要提供,具有所有属性并采用所需的格式。

有点像JAVA等其他环境中的“值对象”(POJO),在打包和展示数据时提供方便。它们应该是暂时的,而不是持久化在数据库中;但同时包含所有必要的属性和原始数据类型(在 Django 世界中,这称为“_meta”)。

感谢您的回复和建议。

【问题讨论】:

  • 那么问题出在哪里?只需创建一个包含这两个模型属性的类作为实例。
  • 有趣!有代码示例吗?
  • 听起来你要使用的是 Django Rest Framework。
  • 感谢大家的回答和cmets:Aaron,Alex.. 5 年前,当我刚接触 Python 时,我有先入为主的概念,从 Java 背景带来;在这里和现在,我有多年使用 python 的直接经验,原来的问题似乎不太相关。我对 Alex 和 Aaron 的感激之情始终如一。

标签: python json django-models


【解决方案1】:

这不适合你吗?

class Foo(models.Model):
    field = DoesNotMatter()

class Bar(models.Model):
    field = DoesNotMatter()


class Combined(object):

    def __init__(self, foo, bar):
        self.foo_field = foo.field
        self.bar_field = bar.field

【讨论】:

  • 感谢您的建议,亚历克斯。在我们将这个想法融入我们的以下代码块之后,我们得到了错误: ... 'Composite' object has no attribute '_meta' ... 这是我们的困境:当数据转储没有 '_meta' 时,生成的 JSON包含所有在 str 中的键和值字典列表。另一方面,像 'Comment' 这样的原生对象可以有更好的(int 和其他数据类型......)看起来 JSON,像这样:[{"pk": 1, "model": "blog.comment", " fields": {"body": "Comments on Craps", "post": 2, "author": "Foo", "created": "2012-03-02 10:39:48"}}]
  • **********models.py ************************ 类帖子(models.Model): title = models.CharField(max_length=60) body = models.TextField() created = models.DateTimeField(auto_now_add=True) def __unicode__(self): return self.title class Comment(models.Model): created = models.DateTimeField (auto_now_add=True) author = models.CharField(max_length=60) body = models.TextField() post = models.ForeignKey(Post) def __unicode__(self): return unicode("%s: %s" % (self. post, self.body[:60]))
  • ### value object to test class Composite(object): def __init__(self, post, comment): self.post_title = post.title self.post_body = post.body self.post_created = post .created if comment: self.comment_created = comment.created self.comment_author = comment.author self.comment_body = comment.body else: pass
  • ************** views.py ***************** def list_composites(request): 时尚数据 = [] N = 10 date_N_days_ago = datetime.now() - timedelta(days=N) raw_data = Post.objects.filter(created__gte=date_N_days_ago) 用于 raw_data 中的帖子:尝试:latest_comment = post.comment_set.latest('created')除了 Comment.DoesNotExist: latest_comment = None my_instance = Composite(post, latest_comment) fashion_data.append(my_instance) data = serializers.serialize("json", fashion_data) return HttpResponse(data, content_type="application/json")
  • 这个问题的答案建议使用 simplejson 而不是 djangos 序列化器:stackoverflow.com/questions/1005422/…
【解决方案2】:

一旦我放弃了从 JAVA 背景继承的值对象的概念, 并开始专注于我真正想要的东西,我找到了一个简单的方法来获得 this:根据数据在views.py中自定义构建字典 从相关模型回来。然后将每个字典添加到 一个列表桶并在呈现 JSON 提要之前使用 json 转储。

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 2015-10-15
    • 2011-06-22
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多