簡體   English   中英

Django多對多,使用REST進行排序和序列化

[英]Django Many to Many, ordering and serializing using REST

我正在設計一個系統,該系統允許用戶在預先配置的有序對象集中(計數> 5)選擇多個對象(例如5)。 基本上,用戶必須在9個集合中選擇前5個對象。我必須保存這些條目,並找出具有最高投票數(最多選擇)和基於最正確條目的獲勝者的對象。

我的模特:

class User(AbstractUser):
    '''Info about user '''

class Contest(models.Model):
    name = models.CharField(max_length=255)
    created = models.DateField(auto_now_add=True)


class ObjectsForContest(models.Model):
    name = models.CharField(max_length=255)
    contest = models.ManyToManyField('Contest', through='OrderedObjectsForContest')

class OrderedObjectsForContest(models.Model):
    choice = models.ForeignKey(ObjectsForContest)
    contest = models.ForeignKey(Contest, related_name='ordered_options')
    order = models.PositiveIntegerField()

    class Meta:
        ordering = ['order']

class UserEntriesForContest(models.Model):
    user = models.ForeignKey(User, related_name="entries_for_contest")
    contest = models.ForeignKey(Contest, related_name='participating_users')
    objects_selected = models.ManyToManyField(ObjectsForContest, through='OrderedChoicesByUser', null=True, blank=True)

    def __unicode__(self):
        return self.user.unique_id

class OrderedChoicesByUser(models.Model):
    choice = models.ForeignKey(ObjectsForContest)
    contest = models.ForeignKey(UserEntriesForContest)
    order = models.PositiveIntegerField()

    class Meta:
        ordering = ['order']

我的序列化器非常簡單。 序列化器:

class ContestObjectsSerializer(serializers.ModelSerializer):
    class Meta:
        model = ObjectsForContest
        exclude = ("contests", )


class ContestObjectsThroughSerializer(serializers.ModelSerializer):
    choice = ContestObjectsSerializer()

    class Meta:
        model = OrderedObjectsForContest
        exclude = ("id", )


class Contest(serializers.ModelSerializer):
    winner = SimpleUserProfileSerializer()  #this serializes the user and not included here.
    choices = ContestObjectsThroughSerializer(many=True)

    class Meta:
        model = Contest


class UserEntriesForContestSerializer(serializers.ModelSerializer):
    choices_made = ContestObjectsSerializer(many=True)

    class Meta:
        model = UserEntriesForContest

如何找到最大數量的用戶根據其訂單選擇的選項?

例如 競賽對象:(名稱,順序)

(Apple, 1), (Orange, 2), (Grapes, 3), (Mango, 4), (Apricot, 5), (Cherry, 6), (Guava, 7), (Jackfruit, 8), (Lime, 9)

讓我們假設有5個用戶,他們的選擇是:

#User 1:
(Apple, 1), (Lime, 2), (Grapes, 3), (Mango, 4), (Apricot, 5)
#User 2:
(Apple, 1), (Orange, 2), (Lime, 3), (Mango, 4), (Apricot, 5)
#User 3:
(Apple, 1), (Orange, 2), (Grapes, 3), (Cherry, 4), (Apricot, 5)
#User 4:
(Apple, 1), (Orange, 2), (Lime, 3), (Cherry, 4), (Apricot, 5)
#User 5:
(Apple, 1), (Lime, 2), (Grapes, 3), (Cherry, 4), (Apricot, 5)

獲獎名單應為:

(Apple, 1), (Orange, 2), (Grapes, 3), (Cherry, 3), (Apricot, 5)

我需要知道如何根據我的模型獲得此列表。

可以通過DRF中的SerializerMethodField完成多對多訂單

students_listss = serializers.SerializerMethodField('get_students_list')

def get_students_list(self, instance):
    return Student.objects\
        .filter()\
        .order_by('name')\
        .values_list('name', flat=True)

您可以像往常一樣在order_by()中應用訂單條件

使用estappie REST框架獲取詳細信息。 通過使用tatsypie,您可以使用http://django-tastypie.readthedocs.org/en/latest/fields.html#tomanyfield訪問文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM