Django之Mode的外键自关联和引用未定义的Model

Django Model的外键自关联

在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上级部门(super_department),上级部门应该是一个外键并引用Model Department,即:

class Department(models.Model):

    '''
    some other filed
    '''
    super_department = models.ForeignKey(Department)


但是这样的定义对于python来说是不允许的,因为在定义Field super_department时,Department定义还未完成,python会提示你Department未定义,那么怎么办呢?放心吧,django已经为你考虑好这种情况了,只需要在定义时将ForeignKey所引用的Model改为‘self’即可,即:

class Department(models.Model):
    
    '''
    some other filed
    '''
    super_department = models.ForeignKey('self')


然后同步models至数据库时就会生成一个引用自己的外键。

Django Model之引用一个未定义的Model

有时在django的Model定义中,会出现引用一个未定义Model的情况,比如一个用户(User)属于某一个部门(Department),每一个部门有一个领导(leader),这个领导也是一个用户,即:

class Department(models.Model):
    
    name = models.CharField(max_length=20)
    leader = models.ForeignKey(User, related_name = 'lead_group', null = True)

class User(models.Model):
   
   username = models.CharField(max_length = 20)
   department = models.ForeignKey(Department, related_name = 'users')

但这么定义就会引发在Department定义时,Field leader引用User,但此时的User还未定义。有人会说,先定义User,再定义Department,那也会引发一样的问题,因为User的department引用Department,此时的Department一样未被定义。那么这时候怎么办呢?其实,只需要将ForeignKey引用的Model改为字符串即可,即:

class Department(models.Model):
    
    name = models.CharField(max_length=20)
    leader = models.ForeignKey('User', related_name = 'lead_group')#User now be str type

class User(models.Model):
   
   username = models.CharField(max_length = 20)
   department = models.ForeignKey(Department, related_name = 'users')


  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django的模型中,如果定义了一个外键(ForeignKey)字段,那么在保存模型对象时,Django会自动保存关联对象。如果这个外键是指向Django的User模型(即用户模型),那么Django会自动为你创建一个用户对象,并将其与外键字段关联起来。 举个例子,假设你有一个博客应用,其中有一个Post模型和一个User模型,你想让每篇博客都有一个作者,可以在Post模型中添加一个外键字段,指向Django的User模型: ```python from django.db import models from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) ``` 在这个模型中,我们定义了一个ForeignKey字段,指向Django的User模型,并设置了on_delete为CASCADE,表示当User对象被删除时,所有与之相关的Post对象也会被删除。 当你在视图中创建一个新的Post对象时,只需要将author字段设置为当前登录用户即可: ```python from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .models import Post @login_required def create_post(request): if request.method == 'POST': title = request.POST.get('title') content = request.POST.get('content') post = Post(title=title, content=content, author=request.user) post.save() return redirect('post_detail', pk=post.pk) else: return render(request, 'create_post.html') ``` 在这个视图中,我们从POST请求中获取title和content字段,然后创建一个新的Post对象,并将author字段设置为当前登录用户,最后保存到数据库中。 这样,当你创建一个新的Post对象时,Django会自动创建一个与之关联的User对象,并将其保存到数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值