2017-02-27 82 views
1

我有標準的django User model和我有一個擴展型號Member。會員模型已連接到訂閱模型。保存到數據庫只有一個查詢

class Type(models.Model): 
    limit = models.IntegerField() 
    name = models.CharField(max_length=50) 
    default = models.BooleanField() 

    def __str__(self): 
     return self.name 


class Subscription(models.Model): 
    started = models.DateField() 
    type = models.OneToOneField(Type) 

    def __str__(self): 
     return self.type.name 


class Member(models.Model): 
    user = models.ForeignKey(to=User) 
    number = models.CharField(max_length=10) 
    match_code = models.CharField(max_length=50) 
    parent = models.ForeignKey("self", null=True, blank=True) 
    name = models.CharField(max_length=100) 
    address = models.CharField(max_length=255) 
    postcode = models.CharField(max_length=10) 
    city = models.CharField(max_length=100) 
    country = models.ForeignKey(to=Country, null=True) 
    language = models.ForeignKey(to=Language) 
    telephone = models.CharField(max_length=50) 
    mobile = models.CharField(max_length=50) 
    main_email = models.EmailField(null=True, blank=True) 
    active = models.BooleanField() 
    subscription = models.ForeignKey(Subscription) 

    def __str__(self): 
     return self.name 

當我創建一個新用戶,當我想將它保存到數據庫中,我做如下:

language = Language.objects.get(key="EN") 
    country = Country.objects.get(key="BE") 

    # Add to user model 
    user = User() 
    user.username = request.POST['email'] 
    user.first_name = request.POST['firstname'] 
    user.last_name = request.POST['lastname'] 
    user.email = request.POST['email'] 
    user.set_password(request.POST['password']) 
    user.save() 

    # Add subscription 
    subscription = Subscription() 
    subscription.started = datetime.date.today() 
    subscription.type = Type.objects.filter(default=True) 
    last_subscription = Subscription.objects.all().order_by('-id')[0] 

    # Get the last field from user model 
    last_user = User.objects.all().order_by('-id')[0] 
    # Add to member model with the last user 
    member = Member() 
    member.number = request.POST['member_id'] 
    member.address = request.POST['address'] 
    member.postcode = request.POST['postcode'] 
    member.city = request.POST['city'] 
    member.country = country 
    member.telephone = request.POST['telephone'] 
    member.mobile = request.POST['mobile'] 
    member.user = last_user 
    member.language = language 
    member.active = False 
    member.subscription = last_subscription 
    member.save() 

但是我認爲我打的數據庫來很多次。有沒有更好的解決方案來做到這一點?可以用一個查詢來完成嗎?

+0

您必須爲您的對象編寫多個查詢,但嘗試在一行中創建對象,如:member = Member.objects.create(number = request.POST ['member_id'],<其他字段>) –

回答

3

幾件事情錯在這裏

subscription.type = Type.objects.filter(default=True) 

您asigning整個查詢集來subscription.type這個代碼將在這裏產生一個錯誤。其次,不要使用默認值作爲模型字段名稱。

last_subscription = Subscription.objects.all().order_by('-id')[0] 

不太確定你在這裏試圖做什麼。高效且無錯誤的方法是保存訂閱對象,並將其生成的ID用於下一步操作。

user.username = request.POST['email'] 
user.first_name = request.POST['firstname'] 
user.last_name = request.POST['lastname'] 
user.email = request.POST['email'] 
user.set_password(request.POST['password']) 

直接傳遞數據到模型並不是一個好主意。您應該先使用django表單來驗證它們。

last_user = User.objects.all().order_by('-id')[0] 
# Add to member model with the last user 

這可能是也可能不是您剛保存的用戶。在這個線程完成之後,另一個實例很可能會保存另一個用戶。使用user.id更安全(正如已經提到的關於訂閱)

1

實際上,您不需要獲取上次訂閱或最後一個用戶實例。你可以(也應該!)只使用你的訂閱和用戶對象。因爲在調用save方法後他們將有id。 "Auto-incrementing primary keys"

此外,似乎你從來沒有保存過訂閱實例。