gpt4 book ai didi

ruby-on-rails - Django相当于Rail的has_one通过

转载 作者:行者123 更新时间:2023-12-04 18:05:16 25 4
gpt4 key购买 nike

在 Django 中是否有等同于 has_one :through 的东西?

我有 UserCompanyCompanyMember 模型。 CompanyMember 具有指向UserCompany 的外键。 User 可以通过 CompanyMember 模型属于 Company。假设 UserCompanyMember

中是唯一的

在 Rails 中,这种关系类似于

class User < ActiveRecord::Base
has_one :company_member
has_one :company, :through => :company_member
end

class Company < ActiveRecord::Base
has_many :company_members
end

class CompanyMember < ActiveRecord::Base
belongs_to :company
belongs_to :user
end

我将能够使用 user.company 获取用户的公司。

在 Django 中,我有这样的模型

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


class Company(models.Model):
name = models.CharField()


class CompanyMember(models.Model):
company = models.ForeignKey(Company)
user = models.ForeignKey(User, unique=True)
is_company_admin = models.BooleanField(default=False)

是否可以让 user.company 像在 Rails 中一样工作?我还希望能够在查询集过滤器中使用它,例如 user__company=company

最佳答案

这应该做你想做的:

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


class Company(models.Model):
name = models.CharField()
users = models.ManyToManyField(User, through='CompanyMember')

class CompanyMember(models.Model):
company = models.ForeignKey(Company)
user = models.ForeignKey(User, unique=True)

更多信息:https://docs.djangoproject.com/en/1.7/topics/db/models/#extra-fields-on-many-to-many-relationships

更新:

要访问给定用户的公司,您现在可以这样做:

myuser.company_set.first()

您可能不想更改内置用户模型。但是您可以使用代理模型相当轻松地添加自己的便利方法/属性,例如:

class MyUser(User):
@property
def company(self):
return self.company_set.first()
class Meta:
proxy=True

然后,任何时候您通常会使用 User 对象,请改用 MyUser,它将为您提供方便的属性。例如:

MyUser.objects.get(id=123)

将是相同的记录

User.objects.get(id=123)

但是您将在对象上拥有额外的便捷方法/属性。例如:

myuser = MyUser.objects.get(id=123)
myuser.company

关于ruby-on-rails - Django相当于Rail的has_one通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28227058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com