簡體   English   中英

基於現有模型對象創建 django 用戶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM