2016-10-30 10 views
0

У меня есть два классаДжанго Добавить PrimaryKeyRelatedField Список

class Drink(models.Model): 
    name = models.CharField(max_length=100, blank=False, default='') 
    brand = models.TextField() 
    percentage = models.IntegerField() 

class Drinking(models.Model): 
    amount = models.IntegerField(blank=False) 
    drinks = models.ForeignKey(Drink, related_name='drinks',blank = True,null=True) 

и хотим добавить список напитков в модель Питьевой через REST POST.

В сериализаторе У меня есть следующий:

class DrinkingSerializer(serializers.ModelSerializer): 
    drinks = serializers.PrimaryKeyRelatedField(many=True, read_only=False ,queryset=Drink.objects.all()) 

class Meta: 
    model = Drinking 
    fields = ('pk','drinks','amount') 

def create(self, validated_data): 
    return Drinking.objects.create(**validated_data) 

def update(self, instance, validated_data): 
    instance.amount = validated_data.get('amount', instance.amount)  
    instance.save() 
    return instance  

Когда я пытаюсь опубликовать Drinking объект:

{ 
    "drinks": [2], 
    "amount": 5 
} 

Я получаю ошибку, что Drinkings.drinks должен быть Пейте экземпляр. Я предполагаю, что мне нужно изменить набор запросов, чтобы получить первичный ключ от напитков, но я не знаю, как это сделать.

UPDATE Я сделал небольшое изменение в логике, так что каждый класс Питьевой может иметь только один напиток и одну сумму. Теперь это работает со следующим Serializer:

class DrinkingSerializer(serializers.ModelSerializer): 
    drink = serializers.PrimaryKeyRelatedField(many=False, read_only=False, queryset=Drink.objects.all()) 

ответ

0

Вы уверены, что объект Drink с id 2 существует?

Кроме того, попробуйте сделать запрос без скобок: "drinks": 2 - в моем DRF Api больше ничего не нужно.

+0

Yup, pk = 2 существует, но если бы я отказался от brackits, это дало бы мне ошибку, что ожидался массив целых чисел. – Stef

+0

Он работает, когда я устанавливаю много = False – Stef

0

Я думаю, что полевые напитки в вашей модели Пьющего должны быть в модели Drink.

class Drinking(models.Model): 
 
    amount = models.IntegerField(blank=False) 
 

 

 
class Drink(models.Model): 
 
    name = models.CharField(max_length=100, blank=False, default='') 
 
    brand = models.TextField() 
 
    percentage = models.IntegerField() 
 
    drinks = models.ForeignKey(Drinking, related_name='drinks',blank = True,null=True)

Затем Используя эти модели вашего сериалайзер должен выглядеть следующим образом:

class DrinkingSerializer(serializers.ModelSerializer): 
 
    drinks = serializers.PrimaryKeyRelatedField(many=True, read_only=False ,queryset=Drink.objects.all()) 
 

 
class Meta: 
 
    model = Drinking 
 
    fields = ('pk','drinks','amount')

Я надеюсь, что это помогает.

+0

Если я ПОЧТАЮ PK в ваш предлагаемый модуль/serializer, я получаю следующую ошибку: TypeError («% s» является недопустимым аргументом ключевого слова для этой функции »% list (kwargs) [0] – Stef

+0

@Stef Что значит« post a pk »? Список: – melsiebub

+0

@Stef Используя мои модели предложений, вы не переопределяете методы создания и обновления. – melsiebub