Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django validate_唯一限制更新/修补程序_Django_Django Rest Framework - Fatal编程技术网

Django validate_唯一限制更新/修补程序

Django validate_唯一限制更新/修补程序,django,django-rest-framework,Django,Django Rest Framework,我有一个通过DRF序列化的模型 class Orders(models.Model): accession = models.CharField(max_length=20) testcode = models.ForeignKey(TestCodes, on_delete=models.CASCADE, related_name='tcodes') # testName = models.ForeignKey(TestCodes, on_delete=models.CASCADE, to_f

我有一个通过DRF序列化的模型

class Orders(models.Model):
accession = models.CharField(max_length=20)
testcode = models.ForeignKey(TestCodes, on_delete=models.CASCADE, related_name='tcodes') # 
testName = models.ForeignKey(TestCodes, on_delete=models.CASCADE, to_field='testname', related_name='tnames')
method = models.CharField(max_length=50, blank=True, null=True, default='NGS')
custName = models.CharField(max_length=50)
testSite = models.CharField(max_length=50)
procedure = models.ForeignKey(Workflows, on_delete=models.CASCADE, blank=True, null=True)
在这里,我试图使登录和测试代码字段组合唯一,以防止用户使用相同的测试代码创建相同的登录

def validate_unique(self, exclude=None):
    qs = Orders.objects.filter(accession=self.accession)
    if qs.filter(testcode=self.testcode).exists():
       raise ValidationError('Accession must be unique per testcode')



def save(self, *args, **kwargs):
 
        self.validate_unique()

        super(Orders, self).save(*args, **kwargs)
它工作得很好,但如果我尝试修补或更新其他字段,它会引发验证错误“每个测试代码的登录必须是唯一的” 这个问题有解决办法吗

序列化程序.py

from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator

from .models import Orders
from testcodes.models import TestCodes

class OrderSerializer(serializers.ModelSerializer):
    testcode = serializers.SlugRelatedField(
        read_only=False,
        queryset=TestCodes.objects.all(),
        slug_field='testcode'
    )

    class Meta:
        model = Orders
        fields = '__all__'

        # validators = [
        #     UniqueTogetherValidator(
        #         queryset=Orders.objects.all(),
        #         fields=['accession', 'testcode']
        #     )
        # ]


我认为您可以在模型中直接处理这个问题,方法是在元类中添加一个惟一的_-together属性,如下所示:

class Orders(models.Model):
    accession = models.CharField(max_length=20)
    testcode = models.ForeignKey(TestCodes, on_delete=models.CASCADE, related_name='tcodes') # 
    testName = models.ForeignKey(TestCodes, on_delete=models.CASCADE, to_field='testname', related_name='tnames')
    method = models.CharField(max_length=50, blank=True, null=True, default='NGS')
    custName = models.CharField(max_length=50)
    testSite = models.CharField(max_length=50)
    procedure = models.ForeignKey(Workflows, on_delete=models.CASCADE, blank=True, null=True)

    class Meta:
        unique_together = ("accession", "testcode")

……我认为您可以在模型中直接处理这个问题,方法是在Meta类中添加一个唯一的_-together属性,如下所示:

class Orders(models.Model):
    accession = models.CharField(max_length=20)
    testcode = models.ForeignKey(TestCodes, on_delete=models.CASCADE, related_name='tcodes') # 
    testName = models.ForeignKey(TestCodes, on_delete=models.CASCADE, to_field='testname', related_name='tnames')
    method = models.CharField(max_length=50, blank=True, null=True, default='NGS')
    custName = models.CharField(max_length=50)
    testSite = models.CharField(max_length=50)
    procedure = models.ForeignKey(Workflows, on_delete=models.CASCADE, blank=True, null=True)

    class Meta:
        unique_together = ("accession", "testcode")

我试过它给出了
{“非字段错误”:[“字段登录,测试代码必须建立一个唯一的集合]]}
你能为你的序列化程序显示完整的代码吗。嗨,我在帖子中补充说它给出了
{“非字段错误”:“字段登录,testcode必须创建一个唯一的集合。”]}
请显示序列化程序的完整代码。您好,我已经在帖子中添加了这一点