django - 使用 OneToOneField 扩展模型
问题描述
我正在尝试扩展django-taggit Tag
模型,使其上有一个added_by
(ForeignKey to User) 字段,因此我可以查询特定用户添加的所有标签。所以,我创建了一个应用程序,并在 models.py 中创建了另一个模型,名为MyTag
,我有一个 OneToOneField Tag
:
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()
问题是,我无法request.user
从models.py 内部访问。
我该如何克服这个问题,即如何正确扩展 django-taggit 的Tag
模型以在其上添加 added_by 字段?
解决方案
我建议使用继承而不是 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
现在要创建 MyTag 的新实例,您可以在视图中执行以下操作:
MyTag.objects.create(added_by=request.user , [... other Tag properties])
推荐阅读
- javascript - 如何根据本机反应中的值更改BackgroundColor
- scenekit - 移动一个 SCNNode 并使其与移动前的相同点
- excel - For循环中if语句的问题
- python - 如果对等公钥未编码为主机私钥,如何生成 DH 共享密钥?
- reactjs - 为孩子卸载反应父母?
- node.js - 我们可以将 npm 包存储在可以直接下载的地方吗?
- elasticsearch - Elasticsearch 7 number_format_exception 将输入值作为字符串
- ruby-on-rails - 无法在导轨上打印数据“名称”红宝石
- json - 使用java流的复杂对象的组列表
- vue.js - 如何构建一个 Vue 应用程序以在另一个应用程序中使用它?