首页 > 解决方案 > 在 django 中获取与选定外键相关的项目

问题描述

我正在构建一个具有客户模型和项目模型以及任务模型的 django 应用程序。在任务模型中,我可以选择客户名称和项目,但问题是在管理面板中它显示了所有项目,有没有办法只为选定的客户显示项目

from django.db import models
from django.contrib.auth.models import User
from suppliers.models import Currency
from users.models import Profile

class Customer(models.Model):
    customer_id = models.AutoField(primary_key=True)
    customer_first_name = models.CharField(max_length=200)
    customer_last_name = models.CharField(max_length=200)
    company = models.CharField(max_length=200)
    customer_phone = models.CharField(max_length=200)
    customer_address = models.CharField(max_length=200)
    email = models.EmailField(null=True, blank=True)
    website = models.CharField(max_length=200, null=True, blank=True)
    creation_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now=True)
    notes = models.TextField()

    def __str__(self):
        return str(self.customer_first_name) + ' ' + str(self.customer_last_name)

class Account(models.Model):
    max_discount = models.DecimalField(max_digits=2, decimal_places=2)
    credit_limit = models.DecimalField(max_digits=20, decimal_places=2)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True, blank=True)
    currency = models.ForeignKey(Currency, on_delete=models.CASCADE)
    sales_man = models.OneToOneField(User, on_delete=models.CASCADE)
    Agent = models.OneToOneField(Profile, on_delete=models.CASCADE)
    status = models.BooleanField(default=True)
    reason = models.TextField()


class TaskPriority(models.Model):
    priority_id = models.AutoField(primary_key=True)
    task_priority_name = models.CharField(max_length=200)

    def __str__(self):
        return str(self.task_priority_name)

class Project(models.Model):
    project_id = models.AutoField(primary_key=True)
    project_name = models.CharField(max_length=200)
    project_balance = models.DecimalField(max_digits=20, decimal_places=2)
    customer_name = models.ForeignKey(Customer, on_delete=models.CASCADE)
    creation_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now=True)
    notes = models.TextField()

    def __str__(self):
        return str(self.project_name)


class Task(models.Model):
    task_id = models.AutoField(primary_key=True)
    task_name = models.CharField(max_length=200)
    customer_name = models.ForeignKey(Customer, on_delete=models.CASCADE, blank=True, null=True)
    task_priority = models.ForeignKey(TaskPriority, on_delete=models.CASCADE)
    employee = models.ForeignKey(Profile, on_delete=models.CASCADE)
    creation_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now=True)
    project = models.ForeignKey(Project, null=True, blank=True, on_delete=models.CASCADE)
    file_name = models.FileField(upload_to='projects_files')
    notes = models.TextField()

    def __str__(self):
        return str(self.task_name)

标签: djangoadmin

解决方案


您可以使用 TabularInline 在管理面板的客户记录视图上创建项目选项卡。

例如:

class ProjectInline(admin.TabularInline):
    model = Project
    extra = 1
    verbose_name = 'Project'
    verbose_name_plural = 'Projects'
    list_display = ...

并在客户管理模型中添加

class CustomerAdmin(admin.ModelAdmin):
    ...
    inlines = (ProjectInline, )

推荐阅读