0
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' 属性を使用する必要があることがわかりました。

しかし、なぜその属性を使用しなければならないのかわかりませんか??

どうして??

4

1 に答える 1

3

UserモデルにM2M を設定すると、Userインスタンスに自動workdailyrecord_set属性が設定されます。2 つのアクセサーが必要なため、workdailyrecord_set2 回設定できないため、django は不平を言います。

user.workdailyrecord_set彼らがそれを許可した場合、その場合に何が返されるかは誰にもわからないので、実際には非常に混乱するでしょう.

related_nameを指す 2 つの関係を区別するには、 を指定する必要がありますUser

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

このように、Userインスタンスには、リレーションシップによって関連するオブジェクトworkdailyrecord_targetのみを照会するリバース マネージャーがあります。WorkDailyRecordUsertarget_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'

残念ながら、M2M に関しては、django の文書化された機能を使用しても、この機能を無効にすることはできませんrelated_name='+'。理由は聞かないでください:)

于 2013-01-16T01:39:10.147 に答える