使用OneToOneField扩展模型 [英] Extend a model using OneToOneField
问题描述
我正在尝试扩展 django-taggit Tag
模型上有一个 added_by
(用户的ForeignKey)字段,因此我可以查询特定用户添加的所有标签.因此,我创建了一个应用程序,并在models.py中创建了另一个模型,称为 MyTag
,并在其上添加了一个OneToOneField来进行 Tag
:
I'm trying to extend django-taggit Tag
model to have an added_by
(ForeignKey to User) field on it, so I can query all tags added by a particular user. So, I have created an app and in models.py there I have created another model, called MyTag
and I have a OneToOneField to Tag
on it:
from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from taggit.models import Tag
class MyTag(models.Model):
tag = models.OneToOneField(Tag, on_delete=models.CASCADE)
added_by = models.ForeignKey(User, on_delete=models.CASCADE)
@receiver(post_save, sender=Tag)
def create_tag(sender, instance, created, **kwargs):
if created:
MyTag.objects.create(tag=instance, added_by=???)
@receiver(post_save, sender=Tag)
def save_tag(sender, instance, **kwargs):
instance.mytag.save()
问题是,我无法从models.py内部访问 request.user
.
The issue is, I can't access request.user
from inside models.py.
如何克服该问题,即如何正确扩展django-taggit的 Tag
模型以在其上具有add_by字段?
How do I overcome the issue, i.e. how do I properly extend django-taggit's Tag
model to have added_by field on it?
推荐答案
我建议使用继承代替OneToOneField.
I would recommend using inheritance instead of OneToOneField.
from taggit.models import Tag
class MyTag(Tag):
added_by = models.ForeignKey(User, on_delete=models.CASCADE)
现在, MyTag 模型继承了 Tag 模型的所有属性和方法.此处的更多信息: https://docs.djangoproject.com/en/2.2/topics/db/models/#model-inheritance
Now the MyTag model inherits all the properties and methods of the Tag model. More info here: https://docs.djangoproject.com/en/2.2/topics/db/models/#model-inheritance
现在,您可以在视图中创建MyTag的新实例:
Now to create a new instance of MyTag you can do in your view:
MyTag.objects.create(added_by=request.user , [... other Tag properties])
这篇关于使用OneToOneField扩展模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!