Django Rest Framework与ManyToMany字段一起使用

时间:2017-06-17 11:47:46

标签: python django django-rest-framework

我有一个String[] absisse = new String[3]; JSONArray factures= json.getJSONArray("factures"); for (int i = 0; i < factures.length(); i++) { JSONObject c = factures.getJSONObject(i); int nbr = c.getString("nbr_fact"); for(int z=0;z<absisse.length;z++){ absisse[z]=nbr; System.out.println("value mois "+absisse[z]); } } 模型和一个Training模型,它们之间有一个ManyToMany关系。我遇到的问题是Django默认强制执行唯一性,并且不可能在同一Drill上有重复的练习。

要解决这个问题,我可以在设置ManyToMany关系时使用Training参数,但这会导致Django Rest Framework出现很多问题。

还有其他办法吗?我是否必须创建through=模型才能在我的M2M关系中强制执行唯一性?

我与DRF有关的问题是我还需要为创建的新模型安装一个中间串行器。当我想发送through=数据时,这会导致问题,因为它会对其进行验证并删除所有Drill数据,因为由于需要自定义序列化程序,它需要Drill(中间模型)。

这一小小的变化确实很快就需要大量的额外变化。必须有更好的方法。

1 个答案:

答案 0 :(得分:0)

通过模型回答您的问题:

通过模型通常用于向多对多关系添加更多信息(例如,如果您需要添加一些排序顺序,或者关系形成的日期,等等。我相信您会得到这个想法)。

不要使用through =来实现唯一性:

关于沿着这条路走下去以避免唯一性,我认为这不是正确的思考方式。基于Django自己的例子here 你会看到你可以多次将相同的实例添加到m2m关系中:

>>> a2 = Article(headline='NASA uses Python')
>>> a2.save()
>>> a2.publications.add(p1, p2)
>>> a2.publications.add(p3)
Adding a second time is OK:
>>> a2.publications.add(p3)

可以在任何一方(通常不是两者)施放多对多关系,这是实现目标的一种方式:

class Drill(models.Model):
    training = models.ManyToManyField(Training)
    anotherfield = models.CharField('some other field description', max_length = 128)

class Training(models.Model)
    yetAnotherField = models.CharField('yet another field description', max_length = 128)

希望这有帮助