Django - 从 table 中获取在另一个 table 中没有外键的对象

Django - Get objects from the table which do not have a Foreignkey in another table

我是 Django rest framework return 在另一个 table 中没有外键的对象列表。我应该写什么查询集来获取这些对象。

models.py


    class Event(models.Model):
      id = models.IntegerField(primary_key=True)
      title = models.CharField(max_length=100,default='')
      description = models.TextField(blank=True,default='', max_length=1000)
      link = models.URLField(null=True)
      image = models.ImageField(null=True, blank=True)
      organizer = models.CharField(max_length=100, default='')
      timings = models.DateTimeField(default=None)
      cost = models.IntegerField(default=1,null=True,blank=True)

    def __str__(self):
        return self.title

    class Featured(models.Model):

       event = models.ForeignKey(Event, null=True ,on_delete=models.PROTECT, related_name="event")

      def __str__(self):
          return self.event.title
    
      class Meta:
          verbose_name_plural = 'Featured'


views.py

      class Upcoming2EventsViewSet(mixins.RetrieveModelMixin,mixins.ListModelMixin,viewsets.GenericViewSet):
    serializer_class = Upcoming2Events
    
    def get_queryset(self):
        featured_events = Featured.objects.all().values_list('id')
        return Event.objects.filter(id__in=featured_events)
        # return Event.objects.exclude(id__in=featured_events.event.id)
        # # return Event.objects.exclude(id__in = [featured_events.id])
serializers.py

class Upcoming2Events(serializers.ModelSerializer):
    id = serializers.CharField(source='event.id')
    title = serializers.CharField(source='event.title')
    timings = serializers.DateTimeField(source='event.timings')
    organizer = serializers.CharField(source='event.organizer')
    class Meta:
        model = Featured
        fields = ['id','title','organizer','timings']

Error

Got AttributeError when attempting to get a value for field `id` on serializer `Upcoming2Events`.
The serializer field might be named incorrectly and not match any attribute or key on the `Event` instance.
Original exception text was: 'RelatedManager' object has no attribute 'id'.

你能告诉我应该写什么查询集来获取 table 精选中不存在的唯一对象吗?

此外,我应该怎么做才能仅从活动 table 中获取即将到来的 2 个活动,这些活动不在精选 table 中?

Note I am not supposed to use any flag value, can you provide some other solutions?

根据你在这里写的信息,我建议使用标志来确定特色事件。如果您想为特色活动提供更多有关此特定信息的信息,则第二个模型很有用

像这样:

class Event(models.Model):
      id = models.IntegerField(primary_key=True)
      title = models.CharField(max_length=100,default='')
      description = models.TextField(blank=True,default='', max_length=1000)
      link = models.URLField(null=True)
      image = models.ImageField(null=True, blank=True)
      organizer = models.CharField(max_length=100, default='')
      timings = models.DateTimeField(default=None)
      cost = models.IntegerField(default=1,null=True,blank=True)
      featured = models.BooleanField(default=False)

所以你可以直接使用查询集来得到你想要的:

Event.objects.exclude(featured=True)

Event.objects.exclude(featured=True).order_by('-timings')[:2]

我会直接使用 ModelViewsets,因此您将在这里使用您的模型。 视图和序列化器看起来像这样:

views.py

class Upcoming2EventsViewSet(viewesets.ReadyOnlyModelViewSet):
    serializer_class = EventSerializer
    queryset = Event.objects.exclude(featured=True).order_by('-timings')[:2]

serializers.py

class EventSerializer(serializers.ModelSerilizer):
    class Meta:
        model = Event
        fields = ['id', 'title', 'organizer', 'timings']

作为改进,我将提供过滤器而不是设置不同的 ViewSet 来仅过滤查询集。