Django models.py错误(关于ManyToManyField)

时间:2013-01-16 01:28:45

标签: django django-models django-orm

from django.db import models
from django.contrib.auth.models import User

class WorkDailyRecord(models.Model):
    user = models.ForeignKey(User)
    date = models.DateTimeField(auto_now=True)
    contents = models.TextField()
    check_user = models.ManyToManyField(User)
    target_user = models.ManyToManyField(User)

    ONGOING_OR_END =(
            ('ing', '진행중'),
            ('end', '완료'),
        )


    ongoing_or_end = models.CharField(
            max_length=3,
            choices=ONGOING_OR_END,
            default='ing',
        )

我写了那段代码,然后我就给错了......

所以我搜索互联网,发现我必须使用'related_name'属性。

但我不知道为什么我必须使用那个attr ??

为什么?

1 个答案:

答案 0 :(得分:3)

通过为User模型设置M2M,User个实例将在其上设置自动workdailyrecord_set属性。由于你需要2个访问器,django会抱怨,因为它无法设置workdailyrecord_set两次。

如果他们允许,那确实会非常混乱,因为谁知道user.workdailyrecord_set在这种情况下会返回什么。

您需要给它一个related_name来区分指向User的两个关系。

target_user = models.ManyToManyField(User, related_name='workdailyrecord_target')
check_user = models.ManyToManyField(User, related_name='workdailyrecord_check')

这样,User个实例将拥有workdailyrecord_target反向管理器,该管理员只会WorkDailyRecord Usertarget_user {{}}}相关的User.objects.latest('id').workdailyrecord_target.all() # all WorkDailyRecords where user is referenced by 'target_user' User.objects.latest('id').workdailyrecord_check.all() # all WorkDailyRecords where user is referenced by 'target_check' 个对象。

e.g。

related_name='+'

不幸的是,即使使用django记录的{{1}}功能,您也无法禁用此功能。不要问我为什么:)