Django GenericForeignKey

May 2, 2015


最近在项目的一个工作流流程中大量的使用到了GenericForeignKey和 Content Type,主要用于在两个model之间建立一个关联的model,于是做了如下的小结。


model

  • 首先我们需要定义两个需要关联的model

    
     from django.contrib.contenttypes import generic
     class music(models.Model):
         music_url = models.CharField(max_length=20)
         events = generic.GenericRelation('owner')
         #加这句的目的是在该实例删除时owner中的记录也会删除
    
     class vedio(models.Model):
         video_url = models.CharField(max_length=20)
         events = generic.GenericRelation('owner')
      

中间model

  • 建立与两个model建立联系的新的model

    
    class owner(models.Model):
         user = models.ForeignKey(User)
         content_type = models.ForeignKey(ContentType)
         object_id = models.PositiveIntegerField()
         event_object = generic.GenericForeignKey('content_type', 'object_id')
      
  • 通俗一点的理解,content_type定位了一个表,而object_id定位了一个id,event_object就相当于将’content_type’, ‘object_id’结合起来从而定位了一个model中的实例


存储

  • 之前讲过Django的signal,django.db.models.signals.pre_save & django.db.models.signals.post_save分别在一个Model的save()方法之前和之后触发,我们可以应用这个来实现自动存储

    
     from django.db.models.signals import post_save
    
     def save_owner(sender, instance, **kwargs):
         obj = instance
         publisher=User.objects.all()[0]
         event = owner(user=publisher,event_object=obj)
         event.save()
    
     post_save.connect(save_owner,sender=music)
     post_save.connect(save_owner,sender=vedio)