django 主键要与自己行成多对一的关系时可以用models.foreignkey('self'),如果直接存储会提示主键不存在,无法保存.
例如:我想做一个导航类,这些导航存储着自己的父节点,一开始写法为:
class Navi(models.Model): """ Navi has four type: goods, news, page and custom """ STYLE_CHOICES = ( ('goods', 'goods'), ('news', 'news'), ('page', 'page'), ('custom', 'custom'), ) name = models.SlugField() parent = models.ForeignKey('self', null=True, blank=True, related_name='child') style = models.SlugField(choices=STYLE_CHOICES) url = models.CharField(max_length=100, default='#') sort = models.IntegerField(default=1) is_display = models.BooleanField(default=True) def __unicode__(self): return self
该做法无论如何都无法存储第一个数据的,因为你在存储第一个数据时它的主键还未产生,无法形成多对一关系.修改方法如下:
class AbstractNavi(models.Model): parent = models.ForeignKey('self',blank=True, null=True, related_name='child') class Meta: abstract = True class Navi(AbstractNavi): """ Navi has four type: goods, news, page and custom """ STYLE_CHOICES = ( ('goods', 'goods'), ('news', 'news'), ('page', 'page'), ('custom', 'custom'), ) name = models.SlugField() #parent = models.ForeignKey('self', null=True, blank=True, related_name='child') style = models.SlugField(choices=STYLE_CHOICES) url = models.CharField(max_length=100, default='#') sort = models.IntegerField(default=1) is_display = models.BooleanField(default=True) def __unicode__(self): return self.name
定义抽象类AbstractNavi, 让Navi类继承自AbstractNavi.