Django多对多关系插入控件

前端之家收集整理的这篇文章主要介绍了Django多对多关系插入控件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下型号:
  1. class Item(models.Model):
  2. # fields
  3. # ...
  4.  
  5. class Collection(models.Model):
  6. items = models.ManyToManyField(Item,related_name="collections")
  7. # other fields
  8. # ...

现在我想要两件事:

>我想控制是否可以将一个Item添加到Collection中.
>如果添加删除了Item,我希望Collection更新其某些字段.

对于第二个问题,我知道有一个django.db.models.signals.m2m_changed可以用来挂钩关系的变化.是否允许/确定在信号回调中更改Collection?我是否也可以使用该信号“中止”问题1的插入?

解决方法

我认为处理所需行为的最佳方法不是使用信号,而是通过直通表上的重写的save()和delete()方法,您可以使用参数通过参见: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField.through显式定义,并且: https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods

像这样的东西:

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.db import models
  4.  
  5.  
  6. class Item(models.Model):
  7. # fields
  8. # ...
  9.  
  10. class Collection(models.Model):
  11. items = models.ManyToManyField(Item,related_name="collections",through="CollectionItem")
  12. # other fields
  13. # ...
  14.  
  15. class CollectionItem(models.Model):
  16. collection = models.ForeignKey(Collection)
  17. item = models.ForeignKey(Item)
  18.  
  19. def save(self,*args,**kwargs):
  20. # Only allow this relationship to be created on some_condition
  21. # Part 1 of your question.
  22. if some_condition:
  23. super(CollectionItem,self).save(*args,**kwargs)
  24.  
  25. # Update some fields on Collection when this
  26. # relationship is created
  27. # Part 2 of your question (1/2)
  28. self.Collection.updateSomeFields()
  29.  
  30. def delete(self,**kwargs):
  31. collection = self.collection
  32. super(CollectionItem,self).delete(*args,**kwargs)
  33.  
  34. # Update some fields on Collection when this relationship
  35. # is destroyed.
  36. # Part 2 of your question (2/2)
  37. collection.updateSomeFields()

顺便提一下,你会发现添加一个关系会在这个模型上产生一个保存信号.

而且,关于信号,一旦你有了直通表,你就可以监听pre_save和/或post_save信号,但是它们都不允许你直接否决关系的创建.

如果您的一个或两个模型由第三方提供,而您实际上无法创建直通表,那么,是的,信号路径可能是唯一的出路.

https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed

在这种情况下,您可以侦听m2m_changed事件并触发对集合对象的更新(问题的第2部分),并追溯删除不恰当创建的关系(问题的第1部分).然而,由于后一位是一个非常丑陋的kludgy,如果可以,我会坚持使用显式通过表.

猜你在找的Python相关文章