Django 模型中的 OnetoMany 字段
OnetoMany field in django models
根据我的搜索,我了解到 django 中没有 OnetoMany 字段,如果我想让这三个 类 相互连接,有人可以解释或简化解决方案吗?
a UserRank class
我可以定义任意多的等级,例如(船长、二等工程师、大副等)
a User class
可以具有上述等级之一,
一个 job class
可以从 UserRank class
中有 1 个或多个等级
models.py
class UserRank(models.Model):
rank = models.CharField(blank=True,null=True,max_length=150)
def __str__(self):
return self.rank
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=150,unique=True)
name = models.CharField(max_length=150,)
phone = models.CharField(max_length=50)
date_of_birth = models.DateField(blank=True, null=True)
picture = models.ImageField(blank=True, null=True, upload_to='users_imgs')
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
last_login = models.DateTimeField(null=True)
user_rank = models.ForeignKey(UserRank,related_name='userRank',null=True,on_delete=models.SET_NULL)
objects = UserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email','name']
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username.split()[0]
class Job(models.Model):
job_type = (
('I', 'Interval'),
('O', 'One time'),
)
name = models.CharField(max_length=100)
description = models.CharField(max_length=100)
type = models.CharField(max_length=1, choices=job_type)
interval = models.IntegerField()
is_critical = models.BooleanField()
due_date = models.DateField()
user_rank = models.ManyToManyField(UserRank,related_name='ranks',blank=True)
component = models.ForeignKey(
Component, related_name='jobs', on_delete=models.CASCADE)
runninghours = models.ForeignKey(
RunningHours, related_name="RHjobs", on_delete=models.CASCADE)
def __str__(self):
return self.name
您可能正在寻找外键关系的“反向关系”。查看 Django 文档:Following relationships backwards
(总结:Entry
有一个指向 Blog
的外键,默认情况下 Blog.entry_set
是相关 Entry
对象的管理器,f.ex。 Blog.entry_set.all()
或任何更复杂的查询集来过滤它们。名称 entry_set
是默认名称,您可以通过 Entry
中 ForeignKey
上的 related_name
更改它)
在 one-to-many 关系中,“子”实例包含父实例的主键作为外键。
这意味着如果您在 UserRank
和 Job
之间建立关系,则每个 Job instance
将具有一个类型为 ForeignKey
的属性,其中包含父项的主键Job instance
.
# Setup
class UserRank(models.Model):
...attributes
class Job(models.Model):
user_rank = models.ForeignKey(UserRank, on_delete=models.CASCADE, related_name="jobs")
# Accessing jobs from UserRank
user_rank_1 = UserRank.objects.create(...)
# There is one UserRank instance with many child job instances, so we have to cycle through them
for job in user_rank_1.jobs.all():
print(job)
# Result
# >>> job1
# >>> job2
# >>> job3
# Accessing UserRank from a Job instance
job = Job.objects.get(id=1)
# Every job instance only has one parent UserRank, so it's sufficient to reference it directly with the dot notation
print(job.user_rank)
# Result
# >>> user_rank_1
根据我的搜索,我了解到 django 中没有 OnetoMany 字段,如果我想让这三个 类 相互连接,有人可以解释或简化解决方案吗?
a UserRank class
我可以定义任意多的等级,例如(船长、二等工程师、大副等)
a User class
可以具有上述等级之一,
一个 job class
可以从 UserRank class
models.py
class UserRank(models.Model):
rank = models.CharField(blank=True,null=True,max_length=150)
def __str__(self):
return self.rank
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=150,unique=True)
name = models.CharField(max_length=150,)
phone = models.CharField(max_length=50)
date_of_birth = models.DateField(blank=True, null=True)
picture = models.ImageField(blank=True, null=True, upload_to='users_imgs')
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
last_login = models.DateTimeField(null=True)
user_rank = models.ForeignKey(UserRank,related_name='userRank',null=True,on_delete=models.SET_NULL)
objects = UserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email','name']
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username.split()[0]
class Job(models.Model):
job_type = (
('I', 'Interval'),
('O', 'One time'),
)
name = models.CharField(max_length=100)
description = models.CharField(max_length=100)
type = models.CharField(max_length=1, choices=job_type)
interval = models.IntegerField()
is_critical = models.BooleanField()
due_date = models.DateField()
user_rank = models.ManyToManyField(UserRank,related_name='ranks',blank=True)
component = models.ForeignKey(
Component, related_name='jobs', on_delete=models.CASCADE)
runninghours = models.ForeignKey(
RunningHours, related_name="RHjobs", on_delete=models.CASCADE)
def __str__(self):
return self.name
您可能正在寻找外键关系的“反向关系”。查看 Django 文档:Following relationships backwards
(总结:Entry
有一个指向 Blog
的外键,默认情况下 Blog.entry_set
是相关 Entry
对象的管理器,f.ex。 Blog.entry_set.all()
或任何更复杂的查询集来过滤它们。名称 entry_set
是默认名称,您可以通过 Entry
中 ForeignKey
上的 related_name
更改它)
在 one-to-many 关系中,“子”实例包含父实例的主键作为外键。
这意味着如果您在 UserRank
和 Job
之间建立关系,则每个 Job instance
将具有一个类型为 ForeignKey
的属性,其中包含父项的主键Job instance
.
# Setup
class UserRank(models.Model):
...attributes
class Job(models.Model):
user_rank = models.ForeignKey(UserRank, on_delete=models.CASCADE, related_name="jobs")
# Accessing jobs from UserRank
user_rank_1 = UserRank.objects.create(...)
# There is one UserRank instance with many child job instances, so we have to cycle through them
for job in user_rank_1.jobs.all():
print(job)
# Result
# >>> job1
# >>> job2
# >>> job3
# Accessing UserRank from a Job instance
job = Job.objects.get(id=1)
# Every job instance only has one parent UserRank, so it's sufficient to reference it directly with the dot notation
print(job.user_rank)
# Result
# >>> user_rank_1