需要在Django Rest框架中为客户端生成客户端和项目代码

发布于 2025-01-17 10:21:58 字数 4524 浏览 3 评论 0原文

models.py

class Client(models.Model):

    client_name=models.CharField(max_length=30,default=None)
    client_code = models.CharField(max_length=3, default=None, null=True)
    company=models.CharField(max_length=200) 
    finance_contact_email=models.EmailField(max_length=25,default=None)
    business_purpose=models.CharField(max_length=50,null=True,default=None)
    location=models.CharField(max_length=200)
    emergency_contact=models.CharField(max_length=200,null=True,default=None)
    website=models.URLField(max_length=200,null=True)
    comments=models.TextField(max_length=300,null=True, blank=True)
    start_Date = models.DateTimeField(max_length=10,null=True)
    end_Date=models.DateField(max_length=10,null=True)
 
    class Meta:
        
        db_table ='Client'
    
    def __str__(self):
        return '{}'.format(self.client_name)

#Project model
class Project(models.Model):

    project_code = models.CharField(primary_key=False, editable=False, max_length=10,default=None,null=True)
    #client_project_code = models.CharField(primary_key=False, editable=False, max_length=10,default=None,null=True)
    project_name = models.CharField(max_length=30,unique=True,default=None)
    client_code = models.ForeignKey(Client,on_delete=CASCADE,related_name="Client5",default=None, null=True) # need to get the client code instead of name but the name should be returned in client model
    client= models.ForeignKey(Client,on_delete=CASCADE,related_name="Client1",default=None)
    user=models.ManyToManyField(User,related_name='users',default=None)
    description=models.TextField()
    type=models.TextField()                                      #dropdown
    start_date = models.DateTimeField(max_length=10)
    end_date=models.DateTimeField(max_length=10)
    technical_contact_name = models.CharField(max_length=30)
    email=models.EmailField(max_length=254,default=None)
    phone = PhoneField(blank=True)
    delivery_head_contact_name=models.CharField(max_length=30)
    
    class Meta:
        
        db_table ='Project'


    def save(self, **kwargs):
        if not self.id:
            max = Project.objects.aggregate(id_max=Max('project_code'))['id_max']
            self.project_code = "{}{:03d}".format('', max if max is not None else 1)
        super().save(*kwargs)

    def __str__(self):
        return '{}'.format(str(self.client_code), str(self.project_code))

根据上面的代码,我在客户端模型中创建了一个客户端代码,我需要将客户端代码与在项目代码字段本身或新字段中自动生成的项目代码结合起来。 例如:客户代码:ICN 和项目代码:ICN001。 一件主要的事情是我希望在客户端模型中返回客户端名称,并且我需要将客户端代码从客户端模型链接到项目,我被困在该方法上,例如如何返回它?

注意:更改和字段需要反映在 django 管理门户中。

答案后更新了代码:

class Project(models.Model):

    project_code = models.CharField(primary_key=False, editable=False, max_length=10,default=None,null=True)
    #client_project_code = models.CharField(primary_key=False, editable=False, max_length=10,default=None,null=True)
    project_name = models.CharField(max_length=30,unique=True,default=None)
    #client_code = models.ForeignKey(Client,on_delete=CASCADE,related_name="Client5",default=None, null=True)
    client= models.ForeignKey(Client,on_delete=CASCADE,related_name="Client1",default=None)
    user=models.ManyToManyField(User,related_name='users',default=None)
    description=models.TextField()
    type=models.TextField()                                      #dropdown
    start_date = models.DateTimeField(max_length=10)
    end_date=models.DateTimeField(max_length=10)
    technical_contact_name = models.CharField(max_length=30)
    email=models.EmailField(max_length=254,default=None)
    phone = PhoneField(blank=True)
    delivery_head_contact_name=models.CharField(max_length=30)
    
    class Meta:
        
        db_table ='Project'

    def save(self, **kwargs):
        if not self.id:
            max = Project.objects.aggregate(id_max=Max('project_code'))['id_max']
            self.project_code = "{}{:03d}".format('', max if max is not None else 1)
        super().save(*kwargs)

    def __str__(self):
        if self.client is not None:
            return f'{self.client.client_code}{self.project_code}'
        else:
            return self.project_code

根据答案,我更新了代码并删除了客户端代码字段,因为它是客户端的重复列,当我尝试在没有客户端代码字段的情况下输入详细信息时,我收到错误“ValueError at /admin” /应用程序/项目/添加/ “str”类型的对象的未知格式代码“d””。您能帮我解决这个错误吗?

Traceback 的屏幕截图: 输入图片此处描述

models.py

class Client(models.Model):

    client_name=models.CharField(max_length=30,default=None)
    client_code = models.CharField(max_length=3, default=None, null=True)
    company=models.CharField(max_length=200) 
    finance_contact_email=models.EmailField(max_length=25,default=None)
    business_purpose=models.CharField(max_length=50,null=True,default=None)
    location=models.CharField(max_length=200)
    emergency_contact=models.CharField(max_length=200,null=True,default=None)
    website=models.URLField(max_length=200,null=True)
    comments=models.TextField(max_length=300,null=True, blank=True)
    start_Date = models.DateTimeField(max_length=10,null=True)
    end_Date=models.DateField(max_length=10,null=True)
 
    class Meta:
        
        db_table ='Client'
    
    def __str__(self):
        return '{}'.format(self.client_name)

#Project model
class Project(models.Model):

    project_code = models.CharField(primary_key=False, editable=False, max_length=10,default=None,null=True)
    #client_project_code = models.CharField(primary_key=False, editable=False, max_length=10,default=None,null=True)
    project_name = models.CharField(max_length=30,unique=True,default=None)
    client_code = models.ForeignKey(Client,on_delete=CASCADE,related_name="Client5",default=None, null=True) # need to get the client code instead of name but the name should be returned in client model
    client= models.ForeignKey(Client,on_delete=CASCADE,related_name="Client1",default=None)
    user=models.ManyToManyField(User,related_name='users',default=None)
    description=models.TextField()
    type=models.TextField()                                      #dropdown
    start_date = models.DateTimeField(max_length=10)
    end_date=models.DateTimeField(max_length=10)
    technical_contact_name = models.CharField(max_length=30)
    email=models.EmailField(max_length=254,default=None)
    phone = PhoneField(blank=True)
    delivery_head_contact_name=models.CharField(max_length=30)
    
    class Meta:
        
        db_table ='Project'


    def save(self, **kwargs):
        if not self.id:
            max = Project.objects.aggregate(id_max=Max('project_code'))['id_max']
            self.project_code = "{}{:03d}".format('', max if max is not None else 1)
        super().save(*kwargs)

    def __str__(self):
        return '{}'.format(str(self.client_code), str(self.project_code))

As per the above code I created a client code in client model and I need to combine the client code plus the project code which is auto generated in the project code field itself or in a new field.
for ex: client code: ICN and project code: ICN001.
And one main thing is i want the client name to be returned in the client model and i need to link the client code from the client model to the project, I was stuck on that method like how to return it ?

note: the changes and the fields needs to be reflected in the django admin portal.

Updated code after the answer:

class Project(models.Model):

    project_code = models.CharField(primary_key=False, editable=False, max_length=10,default=None,null=True)
    #client_project_code = models.CharField(primary_key=False, editable=False, max_length=10,default=None,null=True)
    project_name = models.CharField(max_length=30,unique=True,default=None)
    #client_code = models.ForeignKey(Client,on_delete=CASCADE,related_name="Client5",default=None, null=True)
    client= models.ForeignKey(Client,on_delete=CASCADE,related_name="Client1",default=None)
    user=models.ManyToManyField(User,related_name='users',default=None)
    description=models.TextField()
    type=models.TextField()                                      #dropdown
    start_date = models.DateTimeField(max_length=10)
    end_date=models.DateTimeField(max_length=10)
    technical_contact_name = models.CharField(max_length=30)
    email=models.EmailField(max_length=254,default=None)
    phone = PhoneField(blank=True)
    delivery_head_contact_name=models.CharField(max_length=30)
    
    class Meta:
        
        db_table ='Project'

    def save(self, **kwargs):
        if not self.id:
            max = Project.objects.aggregate(id_max=Max('project_code'))['id_max']
            self.project_code = "{}{:03d}".format('', max if max is not None else 1)
        super().save(*kwargs)

    def __str__(self):
        if self.client is not None:
            return f'{self.client.client_code}{self.project_code}'
        else:
            return self.project_code

As per the answer I updated the code and removed the client code field as it is a duplicate column of client and when i tried to entry details without the client code field iam getting an error as "ValueError at /admin/App/project/add/
Unknown format code 'd' for object of type 'str'". Can you please help me to solve this error?

screenshot of Traceback:
enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

初见 2025-01-24 10:21:58

您可以使用:

class Project(models.Model):
    # …
    
    def __str__(self):
        if self.client_code is not None:
            return f'{self.client_code.client_code}{self.project_code}'
        else:
            return self.project_code

但是将您的foreferkey交给client name client> client_code:这将返回client client> client> client> client> client> client> client> client> client> client> client> client> name ,这并不多。 对象,而不是其名称,也不是其代码。 客户端因此,可能比 client_code 更好。

You can work with:

class Project(models.Model):
    # …
    
    def __str__(self):
        if self.client_code is not None:
            return f'{self.client_code.client_code}{self.project_code}'
        else:
            return self.project_code

But it makes not much to give your ForeignKey to the Client the name client_code: this will return a Client object, not its name, nor its code. client thus is thus probably a better choice than client_code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文