2017-02-27 80 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"

此外,似乎你从来没有保存过订阅实例。