如何处理django / tastypie中的多对多

时间:2015-01-27 02:33:36

标签: django django-models tastypie

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

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和tastypie是全新的,我有几个问题:

1)在Blueprint和Workload之间指定多对多的正确语法是什么,因此当创建新的Blueprint记录时,它不会遇到数据库约束,抱怨相关的Workload记录不能空

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

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

1 个答案:

答案 0 :(得分: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添加到该字段。

至于网址;这里有大量的帖子显示如何设置一个像你一样的网址。