【问题标题】:How to deal with many-to-many in django / tastypie如何在 django/tasticpie 中处理多对多
【发布时间】:2015-01-27 02:33:36
【问题描述】:

我有以下两个模型,它们之间应该是多对多的:

class Blueprint(models.Model):
    name = models.CharField(max_length=120)
    description = models.TextField()

    class Meta:
        ordering = ["name", ]


class Workload(models.Model):
    blueprints = models.ManyToManyField('Blueprint', db_constraint=False)
    name = models.CharField(max_length=120)
    description = models.TextField()
    image = models.CharField(max_length=120)
    flavor = models.CharField(max_length=120)

    class Meta:
        ordering = ["name", ]

对 django 和 sweetpie 完全陌生,我有几个问题:

1) 在蓝图和工作负载之间指定多对多的正确语法是什么,所以当创建新的蓝图记录时,它不会遇到数据库约束,抱怨相关的工作负载记录不能空的

2) 我的 api.py 的正确语法是什么,将相关的工作负载链接作为 GET /api/blueprint/1 输出的一部分,以及将蓝图链接作为 GET /api 的一部分/workload/1 个输出

我想,对于 django / sweetpie 应用程序来说,多对多是很常见的,而且很久以前就已经解决了,但是,我无法找到一个干净的解决方案(而且我是新的 :)

【问题讨论】:

    标签: django django-models tastypie


    【解决方案1】:

    不确定您遇到了什么问题,但您应该为每个模型添加主键,通常是自动 int 字段。

    class Blueprint(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=120)
        description = models.TextField()
    
        class Meta:
            ordering = ["name", ]
    
    
    class Workload(models.Model):
        id = models.AutoField(primary_key=True)
        blueprints = models.ManyToManyField('Blueprint', db_constraint=False)
        name = models.CharField(max_length=120)
        description = models.TextField()
        image = models.CharField(max_length=120)
        flavor = models.CharField(max_length=120)
    
        class Meta:
            ordering = ["name", ]
    

    您应该能够在没有工作负载的情况下创建蓝图。但是,使用当前语法,您不能在没有分配蓝图的情况下拥有工作负载。如果您想允许没有蓝图的工作负载,请将null=True, blank=True 添加到该字段。

    至于网址;这里有很多帖子展示了如何设置一个像你问的那样的网址。

    【讨论】:

    • 通过您建议的添加,我能够创建新的蓝图记录: b1 = Blueprint(name="b 1", description="b 1 desc") ,然后向它们添加工作负载: b1.workloads.create(name="w 1", description="w 1 desc", blueprint=b1) 。但是,当我执行 GET /api/blueprint/1/ - 我得到这个:{“description”:“b 1 desc”,“id”:1,“name”:“b 1”,“resource_uri”:“/ api/blueprint/1/", "workloads": []} - 如您所见,“workloads: 链接不显示任何子工作负载
    • 我用资源详细信息创建了一个要点:gist.github.com/eugene-goldberg/25b98d9dabc13ba0221a
    • 这里是模型细节的要点:gist.github.com/eugene-goldberg/f3159284f513f5a88282
    • 感谢您的帮助!
    • 对不起,我没有在tastepi工作过;但是在这里进行一些搜索,我认为它可能需要 .ToManyField; stackoverflow.com/questions/13767740/…
    猜你喜欢
    • 2021-01-28
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多