[英]Django - create ForeignKey reference based on existing value in referenced model
[英]create django user based on existing model object
我正在開發物業管理 django 應用程序,其中我的基本模型是租戶,其中包含姓名、姓氏、電子郵件等所有基本信息。願意的租戶將能夠創建用戶帳戶,以便他們可以登錄並預訂健身房/電影院,但不是全部租戶將需要擁有用戶帳戶。 我的問題是:
如何基於現有租戶對象創建新用戶帳戶? 顯然用戶將擁有租戶外鍵,但如何將 Tenant.name、Tenant.surname 等提取到用戶模型中的 1 個以上字段?
ForeignKey 只給我對象的引用,但我可以在創建新用戶期間以某種方式訪問該對象的某些字段,以便確保 Tenant.email 與 user.email 相同?
編輯
tenancy = (('Tenant', 'Tenant'),('Owner', 'Owner'), ('Other', 'Other'))
class Tenant(models.Model):
name = models.CharField(max_length=15, null=True, blank=False)
surname = models.CharField(max_length=30, null=True, blank=False)
email = models.EmailField(max_length=50, unique=True)
phone_number = models.CharField(max_length=20, null=True, blank=True, unique=True)
flat = models.ForeignKey(Flat, on_delete=models.PROTECT)
status = models.CharField(max_length=10, choices=tenancy, null=True, blank=False)
stay_length = models.CharField(max_length=20, null=True, blank=False)
pet_licence = models.CharField(max_length=20, null=True, blank=False)
additional_notes= models.TextField(max_length=300, blank=True)
date_added = models.DateField(auto_now_add=True, null=True)
moved_out = models.BooleanField(default=False)
date_moved_out= models.DateField(auto_now_add=False, null=True)
class Meta:
unique_together = ('name', 'surname',)
def __str__(self):
return f'{self.name} {self.surname}'
現在我想創建用戶帳戶模型,其中姓名、姓氏、電子郵件、電話號碼和單位將是租戶模型的外鍵。 甚至有可能從 1 個對象填充新模型的 4 個外鍵嗎?
我試過使用 ForeignKey.limit_choices_to、ForeignKey.related_name、ForeignKey.to_field(這很接近,但相關的字段必須是唯一的,這對我的情況不起作用)但一切都會出錯。 我只是想知道是否有可能將 1 個對象的 1 個以上 ForeignKey 定向到新模型對象的多個不同字段。
您可以使用to_field
為另一個模型的非 pk 字段創建 fkey,但是,這些字段需要具有唯一約束(即unique=True
) - 這對於 name/surname 似乎不太可能。
聽起來您想要從用戶模型到租戶模型字段的透明訪問,這是不可能的。
您可以創建從用戶到租戶的 fkey:
class User(models.Model):
tenant = models.OneToOneField(Tenant, null=True, blank=True, related_name='user')
...
然后訪問字段
user = User.objects.get(...)
user.tenant.surname
為了保持字段同步,您可以覆蓋save()
方法:
class Tenant(...)
...
def save(self, *args, **kwargs):
if self.user:
self.user.last_name = self.surname
...
self.user.save()
super().save(*args, **kwargs)
除了: null=True
表示數據庫應該允許字段中的空值, blank=True
表示該字段在管理界面中可以為空。 在大多數情況下null=True, blank=True
您可能應該有null=True, blank=True
。
我會以外鍵在Tenant
而不是User
的方式來處理它,並將其定義為可空one-to-one
。 這樣你就可以讓你的User
模型沒有外鍵:
class Tenant(models.Model):
user = models.OneToOneField(
User,
related_name='tenant',
on_delete=models.CASCADE,
null=True,
blank=True,
default=None,
)
然后要創建相關用戶,您可以在Tenant
模型中添加一個方法,如下所示:
class Tenant(models.Model):
...
def create_user(self):
if not self.user:
user = User.objects.create(
first_name=self.name,
last_name=self.surname,
...
)
self.user = user
self.save()
查看此處文檔中的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.