[英]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.