如何使用默认地址保存在django

how to use default address for saving in django

我有模型名称地址,允许用户创建多个地址,也有设置默认地址的功能,但我无法获取它以保存在模型中任何建议都会有很大帮助谢谢

这里是我的地址模型选择被删除了

class Address(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='address')
    reciever_name = models.CharField(max_length=200, blank=False)
    phone_no = models.CharField(validators = [phoneNumberRegex], max_length = 10, blank=False)
    alt_phone_no = models.CharField(validators = [phoneNumberRegex], max_length = 10, blank=True)
    state = models.CharField(max_length=50, choices=state_choice, blank=False)
    pincode = models.CharField(validators = [pincodeRegex], max_length = 6, blank=False)
    eighteen = models.CharField(blank=False, choices=eighteen_choice, default='Yes', max_length=4 )
    city = models.CharField(max_length=100, blank=False)
    address = models.CharField(max_length=500, blank=False)
    locality = models.CharField(max_length=300, blank=True)
    joined_date = models.DateTimeField(default=timezone.now,editable=False)
    update_at = models.DateTimeField(auto_now=True)
    default = models.BooleanField(("Default"), default=False)


    def __str__(self):
        return self.user.username

my views.py 用于将地址设置为默认

@login_required
def set_default_address(request, id):
    Address.objects.filter(user=request.user, default=True).update(default=False)
    Address.objects.filter(pk=id, user=request.user).update(default=True)
    return redirect('accounts:home')

我要保存默认地址的模型

class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE,)
    item = models.ForeignKey(Item, on_delete=models.CASCADE )
    address = models.ForeignKey(Address, default= True, on_delete=models.CASCADE )
    status = models.IntegerField(choices = status_choices, default=1)
    method = models.CharField(max_length=50, blank=False,)
    size = models.CharField(max_length=20, blank=False)
    price = models.FloatField(blank=False)
    created_at = models.DateField(auto_now=True, editable=False)
    payment_status = models.IntegerField(choices = payment_status_choices, default=3)
    order_id = models.CharField(unique=True, max_length=200, null=True, default=None) 
    datetime_of_payment = models.DateTimeField(default=timezone.now)

    def save(self, *args, **kwargs):
        if self.order_id is None and self.datetime_of_payment and self.id:
            self.order_id = self.datetime_of_payment.strftime('COOLBUYORDER%Y%m%dODR') + str(self.id)
        return super().save(*args, **kwargs)

    def __str__(self):
        return self.user.username + " " + str(self.id) + " " + str(self.created_at)

我的views.py获取地址

class Checkout(View):
    def post (self, request,):
        user = request.user
        address = Address.objects.filter(user=request.user)
        cart = request.session.get('cart')
        items = Item.get_items_by_id(list(cart.keys()))
        prefer = request.POST.get('payment')

        for item in items:
            order = Order(user=user, item=item , method=prefer, **address=address.first()** ,size=cart.get(str(item.id)), price=item.price)
            
            order.save()
        request.session['cart'] = {}

        return redirect('orders:cart',)

我想保存默认地址而不是第一个地址

我认为你必须这样做:

address = Address.objects.filter(default=True, user=request.user)

基于此你会得到一个queryset of Address 不能为一或零,那么在你看来你可以做到:

if not address.exists():
    # Redirect to set a default address
default_address = address.first()

然后在循环中添加以下内容:

order = Order(user=user, item=item , method=prefer, address=default_address, size=cart.get(str(item.id)), price=item.price)

当然,您可以遵循许多选项,但这是一种您可以实施的解决方案。