У меня проблема с Django RestFramework при тестировании.У меня есть следующий тест:
def test_update_coupon(self):
response = self.make_coupon_request(
kind="put",
version="v1",
id=2,
data=self.valid_coupon_data
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
Где make_coupon_request имеет возврат:
return self.client.put(
reverse("coupon",
kwargs={
"version": kwargs["version"],
"pk": kwargs["id"]
}
),
data=json.dumps(kwargs["data"]),
content_type='application/json'
)
и valid_coupon_data, где возникает проблема:
self.valid_coupon_data = {
"company": Company.objects.get(id=1),
"name": "Coupon Updated",
"added": "2018-11-30",
"code": "TESTCODE"
}
edit - Пример компании, которая будет в этой структуре:
{
"id": 1,
"name": "test",
"added": "2018-11-30"
},
Таким образом, общая структура будет выглядеть так:
self.valid_coupon_data = {
"company": {
"id": 1,
"name": "test",
"added": "2018-11-30"
},
"name": "Coupon Updated",
"added": "2018-11-30",
"code": "TESTCODE"
}
Я получаю ошибку:в make_coupon_request , который json.dumps не может сериализовать valid_coupon_data :
"TypeError: Object of type Company is not JSON serializable"
У меня есть сериализатор для компании:
class CompanySerializer(serializers.ModelSerializer):
coupons = CouponSerializer(many=True, read_only=True)
class Meta:
model = Company
fields = ("name", "added", "coupons")
И для купона:
class CouponSerializer(serializers.ModelSerializer):
class Meta:
model = Coupon
fields = ("company", "name", "added", "code")
В основном я знаю, что каким-то образом мне нужно использовать сериализатор, чтобы мой тест работал, поскольку json.dumps не принимает необработанный объект Company ... но я не уверен, каки я не совсем понимаю, почему.
Вот мои 2 модели для справки:
class Company(models.Model):
name = models.CharField(max_length=255, null=False)
class Meta:
verbose_name_plural = "Companies"
class Coupon(models.Model):
company = models.ForeignKey(
Company, on_delete=models.CASCADE, related_name='coupons')
name = models.CharField(max_length=100)
added = models.DateField(auto_now_add=True)
code = models.CharField(max_length=255, null=False)