>source

모든 고객 목록 양식을 가져 오려고합니다. Cust Stat (ForeignKey), Django 2.2에 레코드가없는 모델


class Cust(models.Model):
    name = models.CharField(max_length=50)
    active = models.BooleanField(default=True)
class Stat(models.Model):
    cust = models.ForeignKey(Cust, on_delete=models.PROTECT, null=True)
    date = models.DateField(null=True, blank=True)
   

나는 이것을 시도하지만 작동하지 않습니다.

   month = datetime.now()
    month = month.strftime("%Y-%m")
    
    inner_qs = Stat.objects.filter(date__icontains=month)
    data = Cust.objects.exclude(id__in=inner_qs)
    
    print(inner_qs)
    print(data)

위의 쿼리는 다음을 반환합니다.


<QuerySet [<Stat: Ruth>]>
<QuerySet [<Cust: Jhonny>, <Cust: Rony>, <Cust: Sinta>, <Cust: Ruth>]>

보시다시피 결과가 필요합니다 [<Stat: Ruth>] 데이터 쿼리 셋/목록에서 제외됩니다.

하지만 내가 기대 한 것은 :

<QuerySet [<Stat: Ruth>]>
<QuerySet [<Cust: Jhonny>, <Cust: Rony>, <Cust: Sinta>>

  • 답변 # 1

    이후 변수 id__in 목록이어야합니다.

    이 문제를 해결하는 방법에는 두 가지가 있습니다.

    바꾸다

       inner_qs = Stat.objects.filter(date__icontains=month)
        data = Cust.objects.exclude(id__in=inner_qs)
    
    

    1.

       inner_qs = Stat.objects.filter(date__icontains=month)
        data = Cust.objects.exclude(id__in=[o.id for o in inner_qs])
    
    

    2.또 다른 방법은

       id_list =Stat.objects.filter(date__icontains=month).values_list('id', flat=True)
        # flat=True will return list rather than tuple  
        data = Cust.objects.exclude(id__in=id_list)
    
    

    여기에서 먼저 제외 id_list를 생성 한 다음이를 사용하여 제외합니다.

관련 자료

  • 이전 while 루프에서 Bash 변경 변수 값
  • 다음 go - 두 개의 다른 구조체 병합