ManyToMany字段查询returns空集但不为空
ManyToMany field query returns empty set but not empty
我有一个多对多字段,在查询时返回一个空的 QuerySet 但绝对不为空。我可以从管理页面看到这个。
我可以在admin 中看到Vacancy(id=1) 中有一个Application 对象。
另外,当我查询申请的工作时,它 returns Vacancy(id=1).
我在下面包含了我的 shell 脚本。
models.py
class Vacancy(models.Model):
CATEGORY_CHOICES = [
('ADMINISTRATION', 'Administration'),
('CONSULTING', 'Consulting'),
('ENGINEERING', 'Engineering'),
('FINANCE', 'Finance'),
('RETAIL', 'Retail'),
('SALES', 'Sales'),
]
employer = models.ForeignKey('Employer', on_delete=models.CASCADE)
job_title = models.CharField(max_length=35, default=None)
main_duties = models.TextField(default=None, validators=[
MinLengthValidator(650),
MaxLengthValidator(2000)
])
person_spec = models.TextField(default=None, validators=[
MinLengthValidator(650),
MaxLengthValidator(2000)
])
salary = models.PositiveIntegerField(default=None, validators=[
MinValueValidator(20000),
MaxValueValidator(99000)
])
city = models.CharField(choices=CITY_CHOICES, max_length=11, default=None)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=15, default=None)
max_applications = models.PositiveSmallIntegerField(blank=True, null=True)
deadline = models.DateField(blank=True, null=True)
applications = models.ManyToManyField('Application', blank=True)
active = models.BooleanField(default=True)
class Meta:
verbose_name_plural = 'vacancies'
class Application(models.Model):
STAGES = [
('pre-selection', 'PRE-SELECTION'),
('shortlisted', 'SHORTLISTED'),
('rejected pre-interview', 'REJECTED PRE-INTERVIEW'),
('rejected post-interview', 'REJECTED POST-INTERVIEW'),
('successful', 'SUCCESSFUL')
]
candidate = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
job = models.ForeignKey('Vacancy', on_delete=models.CASCADE)
cv = models.CharField(max_length=35, default=None)
cover_letter = models.TextField(default=None, validators=[
MinLengthValidator(0),
MaxLengthValidator(2000)
])
submitted = models.DateTimeField(auto_now_add=True)
stage = models.CharField(choices=STAGES, max_length=25, default='pre-selection')
manage.py shell
>>> from recruit.models import *
>>> RA = Vacancy.objects.get(id=1)
>>> RA
<Vacancy: 1 Research Administrator>
>>> RA.applications.all()
<QuerySet []>
>>> App = Application.objects.get(id=1)
>>> App.job.id
1
>>> App.job
<Vacancy: 1 Research Administrator>
>>>
关于为什么这不起作用的任何想法?
已解决:
class Vacancy(models.Model):
applications = models.ManyToManyField('Application', symmetrical=False, blank=True)
应用程序字段缺少 symmetrical=False
属性!
我有一个多对多字段,在查询时返回一个空的 QuerySet 但绝对不为空。我可以从管理页面看到这个。
我可以在admin 中看到Vacancy(id=1) 中有一个Application 对象。 另外,当我查询申请的工作时,它 returns Vacancy(id=1).
我在下面包含了我的 shell 脚本。
models.py
class Vacancy(models.Model):
CATEGORY_CHOICES = [
('ADMINISTRATION', 'Administration'),
('CONSULTING', 'Consulting'),
('ENGINEERING', 'Engineering'),
('FINANCE', 'Finance'),
('RETAIL', 'Retail'),
('SALES', 'Sales'),
]
employer = models.ForeignKey('Employer', on_delete=models.CASCADE)
job_title = models.CharField(max_length=35, default=None)
main_duties = models.TextField(default=None, validators=[
MinLengthValidator(650),
MaxLengthValidator(2000)
])
person_spec = models.TextField(default=None, validators=[
MinLengthValidator(650),
MaxLengthValidator(2000)
])
salary = models.PositiveIntegerField(default=None, validators=[
MinValueValidator(20000),
MaxValueValidator(99000)
])
city = models.CharField(choices=CITY_CHOICES, max_length=11, default=None)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=15, default=None)
max_applications = models.PositiveSmallIntegerField(blank=True, null=True)
deadline = models.DateField(blank=True, null=True)
applications = models.ManyToManyField('Application', blank=True)
active = models.BooleanField(default=True)
class Meta:
verbose_name_plural = 'vacancies'
class Application(models.Model):
STAGES = [
('pre-selection', 'PRE-SELECTION'),
('shortlisted', 'SHORTLISTED'),
('rejected pre-interview', 'REJECTED PRE-INTERVIEW'),
('rejected post-interview', 'REJECTED POST-INTERVIEW'),
('successful', 'SUCCESSFUL')
]
candidate = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
job = models.ForeignKey('Vacancy', on_delete=models.CASCADE)
cv = models.CharField(max_length=35, default=None)
cover_letter = models.TextField(default=None, validators=[
MinLengthValidator(0),
MaxLengthValidator(2000)
])
submitted = models.DateTimeField(auto_now_add=True)
stage = models.CharField(choices=STAGES, max_length=25, default='pre-selection')
manage.py shell
>>> from recruit.models import *
>>> RA = Vacancy.objects.get(id=1)
>>> RA
<Vacancy: 1 Research Administrator>
>>> RA.applications.all()
<QuerySet []>
>>> App = Application.objects.get(id=1)
>>> App.job.id
1
>>> App.job
<Vacancy: 1 Research Administrator>
>>>
关于为什么这不起作用的任何想法?
已解决:
class Vacancy(models.Model):
applications = models.ManyToManyField('Application', symmetrical=False, blank=True)
应用程序字段缺少 symmetrical=False
属性!