【问题标题】:ManyToMany field query returns empty set but not emptyManyToMany 字段查询返回空集但不为空
【发布时间】:2021-03-23 15:24:07
【问题描述】:

我有一个多对多字段,当查询时返回一个空的 QuerySet 但绝对不是空的。我可以从管理页面看到这一点。

我可以在 admin 中看到 Vacancy(id=1) 中有一个 Application 对象。 另外,当我查询作业以获取应用程序时,它会返回 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')

ma​​nage.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>
>>>

关于为什么这不起作用的任何想法?

【问题讨论】:

    标签: python django sqlite django-models many-to-many


    【解决方案1】:

    已解决:

    class Vacancy(models.Model):
        applications = models.ManyToManyField('Application', symmetrical=False, blank=True)
    

    应用程序字段中缺少symmetrical=False 属性!

    【讨论】:

    • 我偶然发现了这个问题,因为我遇到了同样的问题:在 shell 和我的应用程序中,相关数据没有显示,而在管理员中却显示了。我没有在对象本身上使用 M2M 字段,所以我不明白为什么symmetric=False 突然起作用...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 2019-07-08
    相关资源
    最近更新 更多