【问题标题】:How to use object.id to make another object, creator of the current object?如何使用 object.id 创建另一个对象,即当前对象的创建者?
【发布时间】:2021-04-01 04:01:08
【问题描述】:

我的 django 应用程序“客户端”和“安装”中有两个模型。下面是我的models.py:

models.py

rom django.db import models
from django.utils import timezone
from django.urls import reverse
# Create your models here.


class Client(models.Model):
    name = models.CharField(max_length = 100)
    dob = models.SlugField(max_length = 100)
    CNIC = models.SlugField(max_length = 100)
    property_type = models.CharField(max_length = 100)
    down_payment = models.IntegerField()
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.name


    def get_absolute_url(self):
        return reverse('client_details',kwargs={ 'pk' : self.pk})

class Installment(models.Model):
    client = models.ForeignKey(Client, null=True, on_delete=models.CASCADE)
    installment_month = models.CharField(max_length = 100)
    installment_amount = models.IntegerField()
    installment_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.installment_month

    def get_absolute_url(self):
        return reverse('installment_confirmation')

还有我的观点.py

view.py

# To create new client
class ClientCreateView(CreateView):
    model = Client
    fields = ['name', 'dob', 'CNIC', 'property_type', 'down_payment']


# To add new installment

class AddInstallmentView(CreateView):
    model = Installment
    #template_name = "property_details/addinstallment_form.html"
    fields = ['installment_month', 'installment_amount']


我必须添加新分期的网址如下:

urlpatterns = [
    path('', ClientListView.as_view(), name='client_list'),
    path('new/', ClientCreateView.as_view(), name='add_client'),
    path('<int:pk>/', ClientDetailView.as_view(), name='client_details'),
    path('<int:pk>/Add-Installment', AddInstallmentView.as_view(), name='add_installment'),
    path('confirmation/', views.installment_added, name='installment_confirmation'),
]

您可以看到添加新分期的 URL 是唯一的。例如,

/<local_server_addr>/<client.id>/Add-Installment (because of <int:pk> above)

我可以创建一个新客户端,也可以添加分期付款。

但是如何将分期付款连接到特定客户端?

如何将此client.id 用作当前分期付款的所有者?

看起来,当一个客户端被创建时,它被分配了一些来自 django 的 ID。现在,如何使用该 ID 将其链接到我要添加的分期付款?

【问题讨论】:

  • 如果它是针对当前用户的,则您在请求中有 id。否则,您也可以在 url 中传递 client_id
  • 您能否详细说明您的观点。我没有完全理解。

标签: python django database django-models


【解决方案1】:

您可以通过覆盖form_valid 方法将client.id 设置为所有者来做到这一点,这在question 中得到了解决,但在这种情况下,我们使用URL 参数中的客户端ID:

# To add new installment
class AddInstallmentView(CreateView):
    model = Installment
    #template_name = "property_details/addinstallment_form.html"
    fields = ['installment_month', 'installment_amount']

    def form_valid(self, form):
        # here you get the client id/pk from the url parameters
        form.instance.client = get_object_or_404(Client, pk=self.kwargs['pk'])
        return super(AddInstallmentView, self).form_valid(form)

然后要将所有分期付款链​​接到您可以执行的客户端:

client = Client.objects.get(SOME_FILTER)
installments = client.installment_set.all()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多